leetcode6267添加边使所有节点度数为偶数
原题链接:
https://leetcode.cn/problems/add-edges-to-make-degrees-of-all-nodes-even/
分类讨论
这题基本上是图论的常规操作,但重要的是分清楚情况。
最多添加两条额外的边使得所有点的度变为偶数
则度为奇数的点数量x(x一定小于4) 有以下几种情况:
- x > 4 return false
- x = 4 时 a , b ,c ,d这四个点
存在一对两个点之间不存在边 则可通过加两边方式使得奇数点均变为偶数
否则不行 - x = 2 时 a ,b 两个点
如果两个点之间 不存在边则直接加边即可
若两个点之间也存在点 则可通过加两条边的方式 将两个点都向那个点连一条边
从而达成条件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using namespace std;
typedef long long LL;
class Solution {
public:
/*
这里哈希映射加速的办法还是蛮值得一学的
有些极限的情况下stl会比较慢
本题是两个点 一个10^5 这个数量 故这样*10^6 进行映射则能形成唯一对
*/
// 哈希映射 主要用于优化加速
LL get(int a,int b){
if(a > b){
swap(a,b);
}
return 1000000ll * a + b;
}
bool isPossible(int n, vector<vector<int>>& edges) {
unordered_set<LL>s;
vector<int>d(n + 1,0);
vector<int>vs;
for(auto &e : edges){
int a = e[0];
int b = e[1];
s.insert(get(a,b));
d[a]++;
d[b]++;
}
// 统计度为奇数的点
for(int i = 1 ; i <= n ; i++){
if(d[i] % 2){
vs.push_back(i);
}
}
int c = vs.size();
if(c == 0){
return true;
}
if(c == 2){
int a = vs[0], b = vs[1];
if(!s.count(get(a,b))){
return true;
}
for(int i = 1 ; i <= n ; i++){
if(i == a || i == b){
continue;
}
// 如果存在两个点都没有连接边的点 则可以加边
if(!s.count(get(a,i)) && !s.count(get(b,i))){
return true;
}
}
}
if(c == 4){
vector<int>tmp{vs[0],vs[1],vs[2],vs[3]};
for(int i = 0 ; i < 24 ; i++){
int a = tmp[0],b = tmp[1],c = tmp[2],d = tmp[3];
if(!s.count(get(a,b)) && !s.count(get(c,d))){
return true;
}
next_permutation(tmp.begin(),tmp.end());
}
}
return false;
}
};
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 niiish32x 's blog!