【华为OD机试真题】145、无向图染色

package main

import "fmt"

type graph struct {
	list [][]int
}

func newGraph(m int) *graph {

	return &graph{
		list: make([][]int, m),
	}
}
func (g *graph) addEdge(v1, v2 int) {
	g.list[v1] = append(g.list[v1], v2)
	g.list[v2] = append(g.list[v2], v1)
}

func (g *graph) isDraw(node, color int, drawMap []int) bool {
	for _, neiborNode := range g.list[node] {
		if drawMap[neiborNode] == 0 && color == 0 {
			return false
		}
	}

	return true
}

func countDraw(g *graph, drawMap []int, node int, count *int) {
	if node == len(g.list) {
		*count++
		return
	} else {

		//红色:0 黑色:1
		for i := 0; i <= 1; i++ {
			if g.isDraw(node, i, drawMap) {
				drawMap[node] = i
				countDraw(g, drawMap, node+1, count)
				drawMap[node] = -1
			}
		}
	}
}

func main() {
	var m, n int
	fmt.Scan(&m, &n)

	myGraph := newGraph(m)
	for i := 0; i < n; i++ {
		var temp1, temp2 int
		fmt.Scan(&temp1, &temp2)
		myGraph.addEdge(temp1-1, temp2-1)
	}

	drawMap := make([]int, m)
	for i := 0; i < m; i++ {
		drawMap[i] = -1
	}

	var count int
	countDraw(myGraph, drawMap, 0, &count)

	fmt.Println(count)

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值