二分图定义:
二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。
性质:
- 二分图当且仅当图中不含奇数环
- 将所有点分成两个集合,使得所有边只出现在集合之间,就是二分图
- 二分图:一定不含有奇数环,可能包含长度为偶数的环, 不一定是连通图
根据以上性质我们设计染色法确定二分图的思路是:将图中的每个点进行标记,如果有一个点重复标记,则表示图中含有偶数环,则不是二分图。
代码设计:O(n+m)
package 二分图判断;
import java.util.Arrays;
import java.util.Scanner;
public class 染色法判断二分图 {
static int n,m;
static int N=500010,M=1000010;
static int h[]=new int[N],e[]=new int[M],ne[]=new int[M],idx;
static int st[]=new int[N];
static void add(int a,int b) {
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
static boolean dfs(int u,int color) {
st[u]=color;
for(int i=h[u];i!=-1;i=ne[i]) {
int j=e[i];
if(st[j]==0) {
if(!dfs(j, 3-color)) return false;
}else if(st[j]==color) return false;
}
return true;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();m=sc.nextInt();
Arrays.fill(h, -1);
for(int i=0;i<m;i++) {
int a,b;
a=sc.nextInt();b=sc.nextInt();
add(a, b);add(b, a);
}
boolean flag=true;
for(int i=1;i<=n;i++) {
if(st[i]==0) {
if(dfs(i,1)==false) {
flag=false;
break;
}
}
}
if(flag==true)System.out.println("Yes");
else System.out.println("No");
}
}