典型的有向图求欧拉通路 套模板
class Solution {
public:
unordered_map<int, int> ump; //节点->度数
vector<int> ans1;
vector<vector<int>> ans2;
unordered_map<int, vector<int>> ump2; //节点->该节点可以到达的节点
void dfs(int start) {
while (ump2[start].size()) {
int tmp = ump2[start].back();
ump2[start].pop_back();
dfs(tmp);
}
ans1.push_back(start);
}
vector<vector<int>> validArrangement(vector<vector<int>>& pairs) {
for (auto& each : pairs) {
ump2[each[0]].push_back(each[1]);
ump[each[0]]--;
ump[each[1]]++;
}
bool flag = false;
for (auto& each : ump) { //找起点,如果是半欧拉图在这里执行dfs
if (each.second == -1) {
flag = true;
dfs(each.first);
}
}
if (!flag) dfs(pairs[0][0]); //如果是欧拉图在这里执行dfs,从任意起点开始dfs
reverse(ans1.begin(), ans1.end());
for (int i = 0; i < ans1.size() - 1; ++i) { //将路径转换成pair对
ans2.push_back(vector<int>{ans1[i], ans1[i + 1]});
}
return ans2;
}
};