欧拉回路
TL;DR;
1 | vector<int> euler_circuit(vector<vector<pair<int, int>>> G, int n/*点*/, int m/*边*/) { // 欧拉回路 |
直觉的数学证明
- 所有点都是偶度
当我们对所有边至多访问一次进行dfs
那么对于非起始点u,dfs(u) 什么时候返回
1 | dfs(u): |
直觉告诉我们,
- 如果绕到了u的父节点来源 且无法dfs更深时会返回
- 如果只是绕回了u,而u还有边是不会因此导致返回的
所以只有两种情况
- 第一次返回 是 绕到更深无法继续,第二次是 绕回u且没有多的边
- 只有一次 绕到更深无法继续
而发现 只要把顺序反过来就好了
相关
abc227H