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 }