[bzoj1191]超级英雄
将问题和锦囊二分图匹配即可,注意当某一个不合法就要退出
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 2005 4 struct ji{ 5 int nex,to; 6 }edge[N]; 7 int E,n,m,x,y,ans,vis[N],head[N],mat[N]; 8 void add(int x,int y){ 9 edge[E].nex=head[x]; 10 edge[E].to=y; 11 head[x]=E++; 12 } 13 bool dfs(int k){ 14 if (vis[k])return 0; 15 vis[k]=1; 16 for(int i=head[k];i!=-1;i=edge[i].nex){ 17 int v=edge[i].to; 18 if ((!mat[v])||(dfs(mat[v]))){ 19 mat[v]=k; 20 return 1; 21 } 22 } 23 return 0; 24 } 25 int main(){ 26 scanf("%d%d",&n,&m); 27 memset(head,-1,sizeof(head)); 28 for(int i=1;i<=m;i++){ 29 scanf("%d%d",&x,&y); 30 add(i,x+m+1); 31 add(i,y+m+1); 32 } 33 for(int i=1;i<=m+1;i++){ 34 memset(vis,0,sizeof(vis)); 35 if (!dfs(i)){ 36 printf("%d",i-1); 37 return 0; 38 } 39 } 40 printf("%d",m); 41 }