解题思路:
注意事项:
注意如果找到了解,不要回溯,因为回溯回去啥都回溯没了,所有找到解之后先打印完之和,直接退出程序,不需要回溯,还节约程序执行时间
参考代码:
#include <iostream> #include <vector> #include <set> using namespace std; const int N = 1e5 +10; int pre[N], vis[N]; vector<int> E[N]; set<int> path; void Init() { for(int i = 0; i < N; ++i) pre[i] = i; } int find(int x) { // 递归 (数据量大的时候使用迭代,因为递归会爆栈) return x == pre[x] ? x : pre[x] = find(pre[x]); } //int find(int x) { // 迭代 // int p = x, tmp; // while(x != pre[x]) x = pre[x]; // while(p != x) { // tmp = pre[p]; // pre[p] = x; // p = tmp; // } // return x; //} bool Union(int x, int y) { int x_root = find(x); int y_root = find(y); if(x_root != y_root) { pre[x_root] = y_root; return true; } return false; } void dfs(int s, int t) { if(s == t) { for (set<int>::iterator it = path.begin(); it != path.end(); ++it) { if (it != path.begin()) cout << ' '; cout << *it; } exit(0); // 找到了及时退出 } for(int i = 0; i < E[s].size(); ++i) { int u = E[s][i]; if(vis[u]) continue; vis[u] = 1; path.insert(u); dfs(u, t); vis[u] = 0; path.erase(u); } } int main() { int n, x, y, from, to; scanf("%d", &n); Init(); for(int i = 0; i < n; ++i) { scanf("%d%d", &x, &y); E[x].push_back(y); E[y].push_back(x); if(find(x) != find(y)) { Union(x, y); } else { from = x, to = y; } } path.insert(from); dfs(from, to); return 0; }
0.0分
0 人评分
不容易系列 (C语言代码)浏览:703 |
C语言程序设计教程(第三版)课后习题9.3 (C语言代码)浏览:602 |
点我有惊喜!你懂得!浏览:2028 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:760 |
C语言训练-列出最简真分数序列* (C语言代码)浏览:543 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:561 |
大神老白 (C语言代码)浏览:690 |
用筛法求之N内的素数。 (C语言代码)浏览:890 |
完数 (C语言代码)浏览:757 |
1009题解浏览:802 |