列表

详情


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

给你一个有 n 个节点的 无向 图,节点编号为 1 到 n 。再给你整数 n 和一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 ai 和 bi 之间有一条边。图不一定连通。

你可以给图中添加 至多 两条额外的边(也可以一条边都不添加),使得图中没有重边也没有自环。

如果添加额外的边后,可以使得图中所有点的度数都是偶数,返回 true ,否则返回 false 。

点的度数是连接一个点的边的数目。

 

示例 1:

输入:n = 5, edges = [[1,2],[2,3],[3,4],[4,2],[1,4],[2,5]]
输出:true
解释:上图展示了添加一条边的合法方案。
最终图中每个节点都连接偶数条边。

示例 2:

输入:n = 4, edges = [[1,2],[3,4]]
输出:true
解释:上图展示了添加两条边的合法方案。

示例 3:

输入:n = 4, edges = [[1,2],[1,3],[1,4]]
输出:false
解释:无法添加至多 2 条边得到一个符合要求的图。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: bool isPossible(int n, vector<vector<int>>& edges) { } };

python3 解法, 执行用时: 212 ms, 内存消耗: 53.8 MB, 提交时间: 2022-12-20 09:51:04

class Solution:
    def isPossible(self, n: int, edges: List[List[int]]) -> bool:
        g = defaultdict(set)
        for x, y in edges:
            g[x].add(y)
            g[y].add(x)
        odd = [i for i, nb in g.items() if len(nb) % 2]
        m = len(odd)
        if m == 0: return True
        if m == 2:
            x, y = odd
            return x not in g[y] or any(
                i != x and i != y and x not in g[i] and y not in g[i]
                for i in range(1, n + 1))
        if m == 4:
            a, b, c, d = odd
            return b not in g[a] and d not in g[c] or \
                   c not in g[a] and d not in g[b] or \
                   d not in g[a] and c not in g[b]
        return False

golang 解法, 执行用时: 312 ms, 内存消耗: 34 MB, 提交时间: 2022-12-20 09:50:35

func isPossible(n int, edges [][]int) bool {
	g := map[int]map[int]bool{}
	for _, e := range edges {
		x, y := e[0], e[1]
		if g[x] == nil {
			g[x] = map[int]bool{}
		}
		g[x][y] = true
		if g[y] == nil {
			g[y] = map[int]bool{}
		}
		g[y][x] = true
	}
	odd := []int{}
	for i, nb := range g {
		if len(nb)%2 > 0 {
			odd = append(odd, i)
		}
	}
	m := len(odd)
	if m == 0 {
		return true
	}
	if m == 2 {
		x, y := odd[0], odd[1]
		if !g[x][y] {
			return true
		}
		for i := 1; i <= n; i++ {
			if i != x && i != y && !g[i][x] && !g[i][y] {
				return true
			}
		}
		return false
	}
	if m == 4 {
		a, b, c, d := odd[0], odd[1], odd[2], odd[3]
		return !g[a][b] && !g[c][d] || !g[a][c] && !g[b][d] || !g[a][d] && !g[b][c]
	}
	return false
}

java 解法, 执行用时: 64 ms, 内存消耗: 86 MB, 提交时间: 2022-12-20 09:50:20

class Solution {
    public boolean isPossible(int n, List<List<Integer>> edges) {
        var g = new Set[n + 1];
        Arrays.setAll(g, e -> new HashSet<Integer>());
        for (var e : edges) {
            int x = e.get(0), y = e.get(1);
            g[x].add(y);
            g[y].add(x);
        }
        var odd = new ArrayList<Integer>();
        for (var i = 1; i <= n; ++i)
            if (g[i].size() % 2 > 0) odd.add(i);
        var m = odd.size();
        if (m == 0) return true;
        if (m == 2) {
            int x = odd.get(0), y = odd.get(1);
            if (!g[x].contains(y)) return true;
            for (var i = 1; i <= n; ++i)
                if (i != x && i != y && !g[i].contains(x) && !g[i].contains(y))
                    return true;
            return false;
        }
        if (m == 4) {
            int a = odd.get(0), b = odd.get(1), c = odd.get(2), d = odd.get(3);
            return !g[a].contains(b) && !g[c].contains(d) ||
                    !g[a].contains(c) && !g[b].contains(d) ||
                    !g[a].contains(d) && !g[b].contains(c);
        }
        return false;
    }
}

cpp 解法, 执行用时: 520 ms, 内存消耗: 178.5 MB, 提交时间: 2022-12-20 09:50:05

class Solution {
public:
    bool isPossible(int n, vector<vector<int>> &edges) {
        unordered_set<int> g[n + 1];
        for (auto &e : edges) {
            int x = e[0], y = e[1];
            g[x].insert(y);
            g[y].insert(x);
        }
        vector<int> odd;
        for (int i = 1; i <= n; ++i)
            if (g[i].size() % 2) odd.push_back(i);
        int m = odd.size();
        if (m == 0) return true;
        if (m == 2) {
            int x = odd[0], y = odd[1];
            if (!g[x].count(y)) return true;
            for (int i = 1; i <= n; ++i)
                if (i != x && i != y && !g[i].count(x) && !g[i].count(y))
                    return true;
            return false;
        }
        if (m == 4) {
            int a = odd[0], b = odd[1], c = odd[2], d = odd[3];
            return !g[a].count(b) && !g[c].count(d) ||
                   !g[a].count(c) && !g[b].count(d) ||
                   !g[a].count(d) && !g[b].count(c);
        }
        return false;
    }
};

上一题