题解:

二分图最大匹配

每一个攻击属性向有这个攻击属性的武器连边

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2000005;
int n,m,fi[N],T,num,ne[N],zz[N],f[N],match[N],x,y;
int dfs(int x)
{
    for (int i=fi[x];i;i=ne[i])
     if (f[zz[i]]!=T)
      {
          f[zz[i]]=T;
          if (!match[zz[i]]||dfs(match[zz[i]]))
           {
               match[zz[i]]=x;
               return 1;
         }
      }
    return 0; 
}
void jb(int x,int y)
{
    ne[++num]=fi[x];
    fi[x]=num;
    zz[num]=y;
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
     {
         scanf("%d%d",&x,&y);
         jb(x,i);jb(y,i);
     }
    for (int i=1;i<=10001;i++)
     {
         T++;
         if (!dfs(i))
          {
              printf("%d",i-1);
              return 0;
         }
     } 
}

 

posted on 2018-02-26 14:26  宣毅鸣  阅读(89)  评论(0编辑  收藏  举报