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 }
posted @ 2012-10-18 19:55  Naix_x  阅读(169)  评论(0编辑  收藏  举报