1. 欧拉路径
解决 : 所有点的入度等于出度,或者有且只有两个点,一个点的入度等于出度 + 1, 另一个点的入度等于出度 - 1。
代码
# include <bits/stdc++.h>
using namespace std;
unordered_map<int, vector<int>>G;
unordered_map<int, int>deg;
vector<vector<int>>ans;
void input() {}
void output() {}
// 创建图
void build(vector<vector<int>>pairs) {
for(auto &pair : pairs) {
G[pair[0]].push_back(pair[1]);
deg[pair[0]]--; deg[pair[1]]++;
}
// 判断是否有欧拉路径
bool judge() {
int cntP = 0, cntN = 0;
for (auto &[x, y] : deg) {
if (y > 0) {
if (++ cntP > 1) {
return false;
}
}
if (y < 0) {
if (++cntN > 1) {
return false;
}
}
}
return cntP == 1 && cntN == 1;
}
// 寻找欧拉路径
void euler(int u) {
auto &vec = G[u]; // 这里必须加上引用
while(!vec.empty()) {
int v = vec.back();
vec.pop_back();
euler(v);
ans.push_back(vector<int>({u, v}));
}
}
int main() {
auto pairs = input() ;
build(pairs);
if (judge()) {
for (auto &[x, y] ) {
if (y == -1) {
euler(x);
}
}
if (ans.empty()) euler(deg.begin()->first);
reverse(ans.begin, ans.end());
output();
} else {
printf("Impossible!\n" );
}
return 0;
}
2. 欧拉回路
一笔画问题:图是否可以通过一笔画完成。
解决 : 无向图中,所有点的入度和出度相同。有向图中,入度等于出度。
代码
和欧拉路径的大同小异。