题目大意:给定一些关系,问能有没有最大匹配。
思路:二分图匹配,用染色法判断奇环(因为二分图不会有奇环)
#include<map>
#include<queue>
#include<cmath>
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
#define LL long long
#define inf 0x3f3f3f3f
const double PI=acos(-1.0);
using namespace std;
struct node{
int to,next;
}q[50000];
int cnt,head[50000],cro[50000],col[50000];
bool vis[50000];
void bu(int a,int b){
q[cnt].to=b;
q[cnt].next=head[a];
head[a]=cnt++;
}
int dfs(int u){
for(int i=head[u];~i;i=q[i].next){
int v=q[i].to;
if(vis[v]) continue;
vis[v]=true;
if(cro[v]==-1||dfs(cro[v])){
cro[v]=u;
return 1;
}
}
return 0;
}
bool color(int x){
for(int i=head[x];~i;i=q[i].next){
int u=q[i].to;
if(!col[u]){
col[u]=!col[x];
if(!color(u))
return false;
}
else if(col[x]==col[u]){
return false;
}
}
return true;
}
int main(){
int n,m,i,j,k,a,b,ans;
while(~scanf("%d%d",&n,&m)){
cnt=ans=0;
memset(head,-1,sizeof(head));
memset(col,0,sizeof(col));
for(i=0;i<m;i++){
scanf("%d %d",&a,&b);
bu(a,b);bu(b,a);
}
//col[1]=1;
bool bj=false;
for(i=1;i<=n;i++){
if(!color(i)){
bj=true;break;
//puts("No");continue;
}
}
if(bj){
puts("No");continue;
}
memset(cro,-1,sizeof(cro));
for(i=1;i<=n;++i){
memset(vis,false,sizeof(vis));
ans+=dfs(i);
}
printf("%d\n",ans/2);
}
return 0;
}