2508. 添加边使所有节点度数都为偶数

213 阅读1分钟

题目:
给你一个有 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
}