【匈牙利算法模板】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 }

 

你可能感兴趣的:(【匈牙利算法模板】BZOJ1191-超级英雄)