题目中图片的例子,这个例子里面输出的路径并不是对称的。
比如这里输出的路径为:1 2 6 4 3 5 3 4 7 8 7 4 6 2 1,首先1264顺利常走完,然后35,到5的时候没地方走了,回到递归上一层3,3也没地方走了,返回到上一层4,4这一层中继续for循环寻找没有到达过的点,发现7可以走,所以4是走到7,7再到8,8返回上一层,到7,7这一层返回到4这一层,然后由4那一层逐层返回,所以最后是一开始的4621。
由此可见,最后输出的路径并不都是完全对称的,绝对不能只求出前一半,然后按照前一半给出后一半。
测试用例:
8 10 1 1 2 2 6 6 4 4 5 5 1 1 7 7 4 4 3 3 5 7 8
#include <iostream> using namespace std; int v, w; int k = 0; int g[1001][1001]; int r[5000]; int visited[1001] = { 0 }; int cnt = 0; void dfs(int x) { visited[x] = 1; r[k++] = x; cnt++; for (int i = 1; i <= v; i++) { if (g[x][i] == 1&&!visited[i]) { dfs(i); r[k++] = x; } } } int main() { int s; cin >> v >> w >> s; for (int i = 1; i <= v; i++)for (int j = 1; j <= v; j++)g[i][j] = g[j][i] = 0;//初始化 for (int i = 0; i < w; i++) { int x, y; cin >> x >> y; g[x][y] = g[y][x] = 1; } dfs(s); for (int i = 0; i < k; i++) { cout << r[i]; if (i != k - 1)cout << ' '; else if (cnt != v)cout << ' '; } if (cnt != v)cout << "0"; return 0; }