首页 > 代码库 > BZOJ1191 超级英雄Hero (匈牙利算法)

BZOJ1191 超级英雄Hero (匈牙利算法)

直接跑匈牙利,注意到“只有当选手正确回答一道题后,才能进入下一题,否则就被淘汰”,一旦无法满足就直接退出。

 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #define maxn 2008 5 #define maxm 10008 6  7 struct edge{ 8     int u,v,next; 9 }eg[maxm];10 11 int n,m,sum;12 int last[maxn],l[maxn];13 bool pd[maxn];14 15 void add(int u,int v)16 {17     eg[++sum].u=u;18     eg[sum].v=v;19     eg[sum].next=last[u];20     last[u]=sum;21 }22 bool find(int u)23 {24     for (int i=last[u];i;i=eg[i].next)25     {26         int v=eg[i].v;27         if (!pd[v])28         {29             pd[v]=true;30             if ( (!l[v]) || find(l[v]) )31             {32                 l[v]=u;33                 return true;34             }35             36         }37     }38     return false;39 }40 int main()41 {42     scanf("%d%d",&n,&m);43     int i,j,sum=0,ans=0;44     for(i=1;i<=m;i++)45     {46         scanf("%d",&j);47         add(i,j);48         scanf("%d",&j);49         add(i,j);50     }51     52     memset(l,0,sizeof(l));53     for (i=1;i<=m;i++)54     {55         memset(pd,0,sizeof(pd));56         if (find(i)) ans++; else break; 57     }58     printf("%d",ans);59 }

 

BZOJ1191 超级英雄Hero (匈牙利算法)