题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 题意:给你一个无向图,这个图有20个结点,且每个结点和三个结点相连,现在问你一某一个结点开始,经过所有结点并回到起始点的所有路径,按字典序输出 解析:dfs就好了,从起始点开始dfs,由于每次都是从最小的开始选,所以第一次回到起点的时候肯定是最小字典序的,回溯只是慢慢改变这个字典序,所以这样输出的路径肯定是按字典序输出的
#include <bits/stdc++.h> using namespace std; int a[105][105]; int vis[105]; int ans[105]; int target,case_t; void dfs(int u,int cnt) { if(u==target && cnt == 21) { printf("%d: ",case_t++); for(int i=0;i<cnt;i++) { if(i)printf(" "); printf("%d",ans[i]); } puts(""); return ; } for(int i=1;i<=20;i++) { if(a[u][i] && !vis[i]) { vis[i] = 1; ans[cnt] = i; dfs(i,cnt+1); vis[i] = 0; } } } int main(void) { for(int i=1;i<=20;i++) { int x,y,z; scanf("%d %d %d",&x,&y,&z); a[i][x] = a[x][i] = 1; a[i][y] = a[y][i] = 1; a[i][z] = a[z][i] = 1; } int n; while(~scanf("%d",&n)&&n) { memset(vis,0,sizeof(vis)); target = n; case_t = 1; ans[0] = n; dfs(n,1); } return 0; }