题目大意就是:有n个学生,分成两队,每对中没有相互认识的,否则输出no,如果可以再用最大匹配。
http://acm.hdu.edu.cn/showproblem.php?pid=2444
#include
#include
#include
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;
queueq;
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;
}