首先,二分图又叫二部图,特点是所有点分成两半,每一半内的点之间没有边相连,只有两半之间会有边相连,图内无奇环,当然,单点图或者有单点的图也属于二分图,因此最主要的区分就是图内无奇环了。对于一个图,是否是二分图,常用的方法是黑白染色,由于给定图常常不完全连通,所以只要对于每一个还未标记过的点,从它开始DFS按照黑白相间的方法标记颜色(0/1),每次DFS操作就是将这一连通块内按黑白分成两半,若途中遇到需要然成某种颜色但已经标记为另一种颜色时,则表明出现了奇环,不能构成二分图。而要注意,每次DFS只是将一个连通块分成黑白两半,但不是同一次的DFS得到的黑白点之间并没有关系。
1 int c[100005]; //color,每个点的黑白属性,-1表示还没有标记,0/1表示黑白 2 int num[2]; //在一次DFS中的黑白点个数 3 bool f=0; //判断是否出现奇环 4 5 void dfs(int a,int x){ 6 if(f)return; 7 c[a]=x; 8 num[x]++; 9 for(int i=head[a];~i;i=nxt[i]){ 10 int b=point[i]; 11 if(c[b]==-1)dfs(b,!x); 12 else if(c[b]==x){ 13 f=1; 14 return; 15 } 16 } 17 } 18 //下面是主函数内的调用过程 19 20 for(i=1;i<=n&&(!f);i++){ 21 if(c[i]==-1){ 22 num[0]=num[1]=0; 23 dfs(i,1); 24 25 } 26 }
时间: 2024-11-08 22:38:40