首页 > 代码库 > bzoj 1191 超级英雄Hero

bzoj 1191 超级英雄Hero

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191

题解:

  裸匈牙利,注意如果出现找不到增广路的情况就直接break

 1 #include<cstdio> 2 #include<cstring> 3 #define MAXN 1010 4 int n,m,cnt,match[MAXN*2],head[MAXN*2],ans; 5 bool check[MAXN*2]; 6 struct node 7 { 8     int v,next; 9 }edge[MAXN*4];10 void add(int x,int y)11 {12     edge[++cnt].next=head[x];13     head[x]=cnt;14     edge[cnt].v=y;15 }16 bool Hungary(int u)17 {18     for(int i=head[u];i!=0;i=edge[i].next)19     {20         int v=edge[i].v;21         if(!check[v])22         {23             check[v]=true;24             if(!match[v]||Hungary(match[v]))25             {26                 match[v]=u;27                 return true;28             }29         }30     }31     return false;32 }33 int main()34 {35     scanf("%d%d",&n,&m);36     for(int i=1;i<=m;i++)37     {38         int x,y;39         scanf("%d%d",&x,&y);40         add(i,x+m+1);41         add(i,y+m+1);42     }43     for(int i=1;i<=m;i++)44     {45         memset(check,false,sizeof(check));46         if(Hungary(i))ans++;47         else break;48     }49     printf("%d\n",ans);50     return 0;51 }

 

bzoj 1191 超级英雄Hero