AcWing 860. 染色法判定二分图
原题链接
简单
作者:
Acvv_scl
,
2021-03-10 22:36:51
,
所有人可见
,
阅读 243
注意点
- 稀疏图 使用邻接表来存储图
- 使用数组 color[i] 来表示 第i点的染色情况; 0–未染色;1–染1号色;2–染2号色
- 注意 3-c y总的牛逼思路
- 使用 dfs 递归染邻接点 也就是子孩子 如果孩子染色失败,那么此节点染色失败;
步骤
- 初始化 邻接表 并存储图;
- 使用dfs 来递归染色
- 如果子节点 染色失败 那么此节点染色失败;
import java.util.*;
public class Main{
static int N=100010;
static int M=200010;
static int n;
static int m;
//稀疏图 用邻接表 注意 边用了M
static int[]h=new int[N];
static int []e=new int[M];
static int []ne=new int[M];
static int index;
// color[i] 来表示点的染色情况 0:未染色 1:白色 2:黑色
static int[]color=new int[N];
static void add(int a,int b){
e[index]=b;ne[index]=h[a];h[a]=index++;
}
static boolean dfs(int u,int c){
//记录当前点的 染色情况
color[u]=c;
//深度遍历每一个点;
for(int i=h[u];i!=-1;i=ne[i]){
int j=e[i];
//如果邻接点 没有被染色;
if(color[j]==0){
//如果邻接点 染色失败 就返回false
if(!dfs(j,3-c))return false;
}else if(color[j]==c)return false;//如果领节点的颜色和当前的u点 染色一样 则染色失败
}
//最后 染色 ok 后返回true
return true;
}
public static void main(String[]args){
Scanner sc=new Scanner (System.in);
n=sc.nextInt();
m=sc.nextInt();
Arrays.fill(h,-1);
while(m-->0){
int a=sc.nextInt();
int b=sc.nextInt();
add(a,b);
add(b,a);
}
boolean flag=true;
//遍历每一个节点 来进行染色
for(int i=1;i<=n;i++){
//遍历到的点 如果没有被染色 则对其 进行染色操作
if(color[i]==0){
//如果染色失败 就返回false
if(!dfs(i,1)){
flag=false;
break;
}
}
}
if(flag){
System.out.println("Yes");
}else{
System.out.println("No");
}
}
}