二分图判定

  题意:给定顶点数和边数的无向图,判定其是否为二分图。

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

#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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值