【匈牙利算法模板】BZOJ1191-超级英雄
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int MAXN=1001+100; 7 int p[MAXN][MAXN]; 8 int vis[MAXN],lk[MAXN]; 9 int n,m; 10 11 void init() 12 { 13 scanf("%d%d",&n,&m); 14 for (int i=1;i<=m;i++) 15 { 16 int u,v; 17 scanf("%d%d",&u,&v); 18 p[i][u]=p[i][v]=1; 19 } 20 } 21 22 int find(int u) 23 { 24 for (int i=0;i<n;i++) 25 { 26 if (!vis[i] && p[u][i]) 27 { 28 vis[i]=1; 29 if (!lk[i] || find(lk[i])) 30 { 31 lk[i]=u; 32 return 1; 33 } 34 } 35 } 36 return 0; 37 } 38 39 void Hungary() 40 { 41 memset(lk,0,sizeof(lk)); 42 int ans=0; 43 for (int i=1;i<=m;i++) 44 { 45 memset(vis,0,sizeof(vis)); 46 if (find(i)) ans++;else break; 47 /*我一开始写成了if (!find(i)) 那么输出i-1并且break..后来发现这样的话如果全部题都能够答,就没有输出了*/ 48 } 49 cout<<ans<<endl; 50 } 51 52 int main() 53 { 54 init(); 55 Hungary(); 56 return 0; 57 }