题意:给你n,m,问是否为二分图,若是找出他的最大二分匹配。。。。
#include <queue>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 220;
int col[N], g[N][N],n,m;
int ans[N],vis[N],sum;
int queu[N],judge[N];
//0为白色,1为黑色
bool bfs()
{ //二分图BFS判断
queue<int> p;
memset(col, -1, sizeof(col));
p.push(1);
col[1] = 0;
while(!p.empty()) {
int from = p.front();
p.pop();
for(int i = 1; i <= n; i++) {
if(g[from][i] && col[i] == -1) {
p.push(i);
col[i] = (col[from]+1)%2;//染成不同的颜色
}
else if(g[from][i] && col[from] == col[i])//颜色有相同,则不是二分图
return false;
}
}
return true;
}
int dfs(int id)
{
for(int i=1;i<=n;i++)
{
if(vis[i]==0&&g[id][i])
{
vis[i]=1;
if(ans[i]==-1||dfs(ans[i]))
{
ans[i]=id;
return 1;
}
}
}
return 0;
}
int main() {
int a, b, i;
while(cin >> n >> m)
{
memset(g,0,sizeof(g));
for(i = 0; i < m; i++) {
cin >> a >> b;
g[a][b] = g[b][a] = 1;
}
if(!bfs())
{
cout << "No" <<endl;
continue;
}
sum=0;
memset(ans,-1,sizeof(ans));
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) sum++;
}
cout<<sum/2<<endl;
}
return 0;
}