这道题一看就是求二分图最大匹配,不过需要注意的是答案需要前面所有题目都能答对,因为这里WA了无数次......
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int tot,a[3001][2],i,j,n,m,k,f[3001],x,y; bool b[3001],flag=0; bool dfs(int x){ b[x]=1; if(!f[a[x][0]]){ f[a[x][0]]=x; return 1; } if(!b[f[a[x][0]]]&&dfs(f[a[x][0]])){ f[a[x][0]]=x; return 1; } if(!f[a[x][1]]){ f[a[x][1]]=x; return 1; } if(!b[f[a[x][1]]]&&dfs(f[a[x][1]])){ f[a[x][1]]=x; return 1; } return 0; } int main() { scanf("%d%d",&m,&n); for(i=1;i<=n;++i)scanf("%d%d",&a[i][0],&a[i][1]); for(i=1;i<=n;++i){ memset(b,0,sizeof(b)); if(!dfs(i)){ flag=1; break; } } printf("%d\n",!flag?n:(i-1)); return 0; }
时间: 2024-10-13 00:52:37