HDU 2063 过山车(匈牙利算法)

题目链接

裸模版题,学习匈牙利算法。看了很多,大体理解了算法过程了。至于思想,以后慢慢体会。

解释一下样例的过程把,从1号女找到1号男,linker记录下女生编号。然后再找二号女,发现和一号男有关系,去再搜一号男的linker1号女是否可以换一个男的,OK,找到了,1号女和2号男连起来。再找三号女,和一号男有关系,同样,去再搜2号,是否可以换个男生,OK,2号女找到了3号男,结束。

 1 #include <cstdio>

 2 #include <cstring>

 3 using namespace std;

 4 int p[501][501],used[501],linker[501];

 5 int n,m;

 6 int dfs(int x)

 7 {

 8     int i;

 9     for(i = 0;i <= m;i ++)

10     {

11         if(p[x][i]&&!used[i])

12         {

13             used[i] = 1;

14             if(!linker[i]||dfs(linker[i]))

15             {

16                 linker[i] = x;

17                 return 1;

18             }

19         }

20     }

21     return 0;

22 }

23 int main()

24 {

25     int i,k,ans,sv,ev;

26     while(scanf("%d",&k)!=EOF)

27     {

28         if(k == 0) break;

29         scanf("%d%d",&n,&m);

30         memset(p,0,sizeof(p));

31         memset(linker,0,sizeof(linker));

32         for(i = 1;i <= k;i ++)

33         {

34             scanf("%d%d",&sv,&ev);

35             p[sv][ev] = 1;

36         }

37         ans = 0;

38         for(i = 1;i <= n;i ++)

39         {

40             memset(used,0,sizeof(used));

41             if(dfs(i))

42             ans ++;

43         }

44         printf("%d\n",ans);

45     }

46     return 0;

47 }

你可能感兴趣的:(HDU)