二分图之匈牙利算法模版
1 /* 2 匈牙利算法模版邻接表版 3 最大匹配问题 4 时间复杂度:O (nm) 5 */ 6 #include <cstdio> 7 #include <vector> 8 #include <cstring> 9 using namespace std; 10 const int maxn = 505; 11 vector<int> v[maxn];//x = v[i][j]表示i可以与x匹配 12 int vis[maxn],match[maxn];//vis[i]防止在每次dfs中重复访问i,x = match[i]表示x当前与i匹配 13 bool dfs(int t) 14 { 15 for(int i = 0; i < v[t].size(); ++i) 16 { 17 int x = v[t][i]; 18 if(!vis[x]) 19 { 20 vis[x] = 1;//防止重复访问 21 if(match[x] == -1 || dfs(match[x]))//如果x无匹配点或者x的匹配点有其他可匹配点 22 {match[x] = t; return true; } 23 } 24 } 25 return false; 26 } 27 int hungary(int n) 28 { 29 int ans = 0; 30 for(int i = 1; i <= n; ++i) 31 { 32 memset(vis,0,sizeof vis); 33 if(dfs(i)) ++ans; 34 } 35 return ans; 36 } 37 int main() 38 { 39 int k,n,x,y; 40 scanf("%d%d",&k,&n);//k->可匹配对数,n->总人数 41 for(int i = 1; i <= n; ++i) 42 v[i].clear(); 43 memset(match,-1,sizeof match); 44 while(k--) 45 { 46 scanf("%d%d",&x,&y); 47 v[x].push_back(y); 48 } 49 printf("%d\n",hungary(n)); 50 return 0; 51 }