题目大意就是:有n个学生,分成两队,每对中没有相互认识的,否则输出no,如果可以再用最大匹配。
http://acm.hdu.edu.cn/showproblem.php?pid=2444
#include<stdio.h> #include<queue> #include<string.h> using namespace std; #define maxn 220 int map[maxn][maxn],use[maxn],path[maxn]; int vis[maxn]; bool bfs(int n) { memset(use,0,sizeof(use)); memset(vis,0,sizeof(vis)); use[1]=1; queue<int>q; q.push(1); vis[1]=1; while(!q.empty()) { int tmp=q.front(); q.pop(); //vis[tmp]=0; for(int i=1;i<=n;i++) { if(map[tmp][i]) { if(use[tmp]==use[i]) return false; if(use[tmp]==1) use[i]=2; if(use[tmp]==2) use[i]=1; if(!vis[i]) { q.push(i);vis[i]=1;} } } } return true; } bool dfs(int x,int n) { for(int i=1;i<=n;i++) { if(!use[i]&&map[x][i]) { use[i]=1; if(!path[i]||dfs(path[i],n)) { path[i]=x; return true; } } } return false; } void match(int n) { memset(path,0,sizeof(path)); int sum=0; for(int i=1;i<=n;i++) { memset(use,0,sizeof(use)); if(dfs(i,n)) sum++; } printf("%d\n",sum/2); } int main() { //freopen("Input.txt","r",stdin); int n,m,i; while(~scanf("%d%d",&n,&m)) { memset(map,0,sizeof(map)); int a,b; for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); map[a][b]=1; map[b][a]=1; } if(!bfs(n)) {puts("No");continue;} // puts("I'm here"); match(n); } return 0; }