您的位置:首页 > 其它

二分图判定

2015-03-07 20:24 204 查看
  题意:给定顶点数和边数的无向图,判定其是否为二分图。

  思路:首先需要知道一个图是二分图并不代表其实联通的,那么遍历每个顶点,对其进行染色,并处理与之相邻的顶点,若无色,则染成与之相反的颜色,若有,则判断是否同色,若同色则不是二分图。所有顶点成功染色即为二分图。

#include <stdio.h>
#include <string.h>
int c[10010];
struct EDGE{
int to;
struct EDGE* next;
}e[80010];//必须开到边数的2倍
int size;
struct EDGE *p[10010];
int ok;
void adde(int u,int v)
{
e[size].to=v;
e[size].next=p[u];
p[u]=&e[size];
size++;
}
void solve(int k)
{
if(!ok) return ;
struct EDGE* u;
for(u=p[k];u!=NULL&&ok;u=u->next){
int t=u->to;
if(c[t]==-1) {c[t]=!c[k];solve(t);}
else if(c[t]==c[k]) {ok=0;return ;}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n,m,i;
scanf("%d%d",&n,&m);
memset(c,-1,sizeof(c));
memset(p,NULL,sizeof(p));
size=0;ok=1;
for(i=0;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
if(u==v) ok=0;
adde(u,v);
adde(v,u);
}
for(i=n;i>0&&ok;i--) if(c[i]==-1){
c[i]=0;
solve(i);
}
printf("%s\n",ok?"Correct":"Wrong");
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分图判定