poj 3041

题目链接:http://poj.org/problem?id=3041

没看题,网上搜最大二分匹配搜到的

匈牙利算法,深搜一次最多增加一个匹配

代码:

#include <stdio.h>
#include <stdlib.h>
int tu[505][505];
int mx[505],my[505];
int flag[505];
short dfs(int n,int s)
{
    int i;
    for(i=1;i<=n;i++)
    {
        if(tu[s][i]==1&&flag[i]==0)
        {
            flag[i]=1;
            if(my[i]==0)
            {
                my[i]=s;
                mx[s]=i;
                return 1;
            }
            else
            {
                if(dfs(n,my[i])==1)
                {
                    my[i]=s;
                    mx[s]=i;
                    return 1;
                }
            }
        }
    }
    return 0;
}

int main(int argc, char** argv) {

    int n,m,i,a,b,sum,j;
   scanf("%d %d",&m,&n);
   memset(tu,0,sizeof(tu));
   memset(mx,0,sizeof(mx));
   memset(my,0,sizeof(my));
   for(i=1;i<=n;i++)
   {
       scanf("%d %d",&a,&b);
       tu[a][b]=1;
      
   }
   sum=0;
    for(i=1;i<=m;i++)
     {
         memset(flag,0,sizeof(flag));
            if(mx[i]==0)
            {
                
                
               sum+=dfs(m,i);
           }
     }
   printf("%d\n",sum);
   
    
    return (EXIT_SUCCESS);
}
posted @ 2012-04-18 09:09  枫月寒  阅读(171)  评论(0编辑  收藏  举报