题目:http://acm.hdu.edu.cn/showproblem.php?pid=3478
注:
二分图的判定(染色法)
二分图与奇环的关系:
如果一图是二分图,那么它一定没有奇环。如果一图没有奇环的话,那么它可以是二分图。
源代码:
#include <stdio.h>
#include <string.h>
#define N 120000
#define M 1020000
typedef struct
{
int v,nxt;
}node;
node e[M];
int head[N],f[N],d[N];
int n,m,s,id,u,v;
int flag,cas,t;
void add(int u,int v)
{
e[id].v=v;
e[id].nxt=head[u];
head[u]=id;
id++;
e[id].v=u;
e[id].nxt=head[v];
head[v]=id;
id++;
}
int dfs(int i) //白色 -1 黑色 1
{
int se,u;
if(flag==0) return 0;
for(int x=head[i];x!=0;x=e[x].nxt)
{
u=e[x].v;
se=-f[i];
if(f[u]!=0)
{
if(se!=f[u]) { flag =0; return 0;}
}
else
{
f[u]=se;
dfs(u);
}
}
return 1;
}
int main()
{
//freopen("D:\\a.txt","r",stdin);
scanf("%d",&cas);
t=0;
while(t<cas)
{
t++;
scanf("%d %d %d",&n,&m,&s);
for(int i=0;i<n;i++) head[i]=0;
for(int i=1;i<=2*m;i++) e[i].nxt=0;
id=1;
memset(d,0,sizeof(d));
for(int i=0;i<m;i++)
{
scanf("%d %d",&u,&v);
d[u]++; d[v]++;
add(u,v);
}
flag=0;
for(int i=0;i<n;i++)
if(d[i]==0)
{
printf("Case %d: NO\n",t);
flag=1;
break;
}
if(flag) continue;
memset(f,0,sizeof(f));
flag=1; f[s]=1;
dfs(s);
if(flag==0) printf("Case %d: YES\n",t);
else printf("Case %d: NO\n",t);
}
}