AcWing 860. 染色法判定二分图-代码注释-golang
原题链接
简单
作者:
望哥
,
2020-07-16 15:40:36
,
所有人可见
,
阅读 528
package main
import(
"fmt"
"bufio"
"os"
)
const N= 100010
var(
reader= bufio.NewReader(os.Stdin)
writer = bufio.NewWriter(os.Stdout)
// 邻接表
e [N*2]int
ne [N*2]int
h [N]int
idx=0
color[N]int // 染色记录
n,m int
)
func insert(a,b int){
idx++
e[idx] = b
ne[idx] = h[a]
h[a] = idx
}
// setColor 着色判断是否二分图
// 一个图的顶点集V可分割为两个互不相交的子集V1,V2,任意边的两个顶点都分属于V1和V2,V1和V2内部无点相连。
// 一个图是二分图当且仅当图中不存在基数环。
func setColor(i, c int) bool {
if color[i] >0 {
// 已经着色过了,判断是否和重新尝试着色的颜色是否一致,是否矛盾
return color[i] == c
}
// 着色
color[i] = c
// 关联点的颜色转换
if c == 1{
c=2
}else{
c=1
}
for j:=h[i]; j>0;j=ne[j] {
k:=e[j]
// 关联点颜色着色
if !setColor(k,c) {
return false
}
}
return true
}
func main(){
fmt.Fscan(reader, &n,&m)
var u,v int
for i:=1;i<=m;i++{
fmt.Fscan(reader, &u, &v)
insert(u,v)
insert(v,u)
}
for i:=1;i<=n;i++{
// 遍历所有点,以便将非连通图的其他点进行着色
if color[i] == 0 && !setColor(i,1) {
fmt.Println("No")
return
}
}
fmt.Println("Yes")
}