题意:
给出一些关系朋友对,问是否能够将朋友分成两组,且各组内人员没有任何关系!!
解法:
判断各朋友下的关系朋友,是否存在关系!!如果存在,输出No,否则输出最大匹配数@
#include<iostream> #include<cstdio> #include<memory.h> #include<algorithm> using namespace std; int vis[202],mat[202],map[202][202]; int n,m,k; int f[1002][1002]; int find(int x) { for(int i=f[x][0]; i>=1; i--) { int y=f[x][i]; if(!vis[y]) { vis[y]=1; if(mat[y]==-1||find(mat[y])) { mat[y]=x; return 1; } } } return 0; } int main() { int i,j,k,ni,mi,ki,ans; while(scanf("%d%d",&n,&m)!=EOF) { memset(f,0,sizeof(f)); memset(mat,-1,sizeof(mat)); memset(map,0,sizeof(map)); // memset(vis,-1,sizeof(vis)); ans=0; for(j=1; j<=m; j++) { scanf("%d%d",&ni,&mi); map[ni][mi]=1; f[ni][++f[ni][0]]=mi; } int flag=0; for(i=1; i<=n&&!flag; i++) { for(j=f[i][0]; j>=1&&!flag; j--) { int x=f[i][j]; for(k=f[i][0]; k>=1; k--) { int y=f[i][k]; if(map[x][y]) { flag=1; break; } } } } if(flag) { cout<<"No"<<endl; continue; } for(i=1; i<=n; i++) { memset(vis,0,sizeof(vis)); if(find(i)) ans++; } printf("%d\n",ans); } return 0; }