题目:
给你一个有 n 个节点的 无向 图,节点编号为 1 到 n 。再给你整数 n 和一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 ai 和 bi 之间有一条边。图不一定连通。
你可以给图中添加 至多 两条额外的边(也可以一条边都不添加),使得图中没有重边也没有自环。
如果添加额外的边后,可以使得图中所有点的度数都是偶数,返回 true ,否则返回 false 。
点的度数是连接一个点的边的数目。
算法:
方法一:分类讨论
度为基数的节点数为m
m=0:直接返回true
m=2:假设两个顶点为a,b。a,b之间没有边,或者找到c,c和a,b都没有边,将ac,bc连起来 ,返回true
m=4:假设两个顶点为a,b,c,d。看ab,cd||ac,bd||ad,bc之间是否没有边,如果没有则可以连起来,返回true
其他情况无解
func isPossible(n int, edges [][]int) bool {
graph := map[int]map[int]bool{}
for i := range edges {
x, y := edges[i][0], edges[i][1]
if _, ok := graph[x]; !ok {
graph[x] = map[int]bool{}
}
graph[x][y] = true
if _, ok := graph[y]; !ok {
graph[y] = map[int]bool{}
}
graph[y][x] = true
}
odd := make([]int, 0)
for i, v := range graph {
if len(v) % 2 != 0 {
odd = append(odd, i)
}
}
m := len(odd)
if m == 0 {
return true
} else if m == 2 {
x, y := odd[0], odd[1]
if !graph[x][y] {
return true
}
for i := 1; i <= n; i ++ {
if i != x && i != y && !graph[i][x] && !graph[i][y] {
return true
}
}
return false
} else if m == 4 {
a, b, c, d := odd[0], odd[1], odd[2], odd[3]
return !graph[a][b] && !graph[c][d] || !graph[a][c] && !graph[b][d] || !graph[a][d] && !graph[b][c]
}
return false
}