核心部分在 dfs(x),来寻找可增广轨。如果找到的话,在 Hungarian()中,最大匹配数加
一。这是用了刚才提到的定理。大家可以想想初始状态是什么,又是如何变化的
view plaincopy to clipboardprint?
1. #include<iostream>
2. #defineF(i,a,b)for(inti=a;i<=b;i++)
3. #definemaxn1002
4. usingnamespacestd;
5. boolmk[maxn],map[maxn][maxn];
6. intmatch[maxn],n,m;
7. booldfs(intx)//寻找增广链,true 表示找到
8. {
9. for(inti=1;i<=m;i++)
10. {
11. if(map[x][i]&&!mk[i])
12. {
13. mk[i]=true;
14. intt=match[i];
15. match[i]=x;
16. if(t==0||dfs(t))
17. returntrue;
18. match[i]=t;
19. }
20. }
21. returnfalse;
22. }
23. inthungarian()
24. {
25. intmax_=0;
26. F(i,1,n)
27. {
28. memset(mk,false,sizeof(mk));
29. if(dfs(i))
30. max_++;
31. }
32. returnmax_;
33. }
34. intmain()
35. {
36. freopen("in.txt","r",stdin);
37. memset(map,false,sizeof(map));
38. cin>>n>>m;
39. inta,b;