将学生分成互不认识的两组,再两两配对。如不能成功分组,就输出no。否则输出配对数
#include <iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn =300;
const int maxm =140000;
int V, M;
vector<int> G[maxn];
int match[maxn];
bool used[maxn];
void add_edge(int u, int v)
{
G[u].push_back(v);
G[v].push_back(u);
}
bool dfs(int v)
{
used[v] = true;
for(int i = 0; i < G[v].size(); i++)
{
int u = G[v][i], w = match[u];
if(w < 0|| !used[w] && dfs(w))
{
match[v] = u;
match[u] = v;
return true;
}
}
return false;
}
int bm()
{
int res = 0;
memset(match,-1,sizeof(match));
for(int v = 0; v < V; v++)
{
if(match[v] < 0)
{
memset(used, 0, sizeof(used));
if(dfs(v))
{
res++;
}
}
}
return res;
}
int main()
{
#ifdef LOCAL
freopen("dd.txt","r",stdin);
#endif
int u, v;
int nx[230],ny[230];
while(~scanf("%d%d", &V,&M))
{
bool flags = true;
memset(nx,0,sizeof(nx));
memset(ny,0,sizeof(ny));
memset(G,0,sizeof(G));
int maps[maxn][maxn];
memset(maps,0,sizeof(maps));
for(int i = 0; i < M; i++)
{
scanf("%d%d", &u, &v);
add_edge(u,v);
maps[u][v] =maps[v][u] = 1;
}
for(int i = 1; i <= V; i++)//判断有没有三点的环,有就直接输入no,因为没法分两组。
{
if(flags == false)
{
break;
}
for(int j = 1; j <=V;j++)
{
if(flags == false)
{
break;
}
for(int k = 1; k <= V; k++)
{
if(maps[i][j] ==1&&maps[j][k] == 1&&maps[k][i]==1)
{
flags = false;
break;
}
}
}
}
if(flags==false)
{
printf("No\n");
}
else
{
int sum =bm();
printf("%d\n",sum);
}
}
return 0;
}