题意:从起点到终点的路,有几条路径,单纯的深搜或广搜是不行的,因为这不再是简单图,可能存在环,所以我们的方法是,先从终点开始广度搜索,把可以到达的点标记,然后在从起点进行深搜
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 22 ; int maps[MAXN][MAXN]; int visited[MAXN]; int path[MAXN],truck[MAXN]; int pointer; int goal,routes; void init(int cur) // dfs预处理,从goal开始寻找可达路 { int i ; truck[cur] = 1 ; for (i = 1; i < MAXN; i++) if (maps[cur][i] && !truck[i]) init(i); } void dfs(int n) { int i; if (n == goal) { routes++; printf("1"); for (i = 1; i < pointer; i++) printf(" %d",path[i]); printf("\n"); } else { for ( i = 1 ; i < MAXN ; i++) if (maps[n][i] && !visited[i] && truck[i]) { path[pointer++] = i; visited[i] = 1; dfs(i); visited[i] = 0; pointer--; // notice } } } int main() { int a,b,Case=1; while (scanf("%d",&goal) != EOF) { routes = 0 ; pointer = 0 ; memset(truck,0,sizeof(truck)); memset(maps,0,sizeof(maps)); memset(visited,0,sizeof(visited)); while (1) { scanf("%d%d",&a,&b); if (!a && !b) break; else maps[a][b] = maps[b][a] = 1; } printf("CASE %d:\n",Case++); path[pointer++] = 1; visited[1] = 1 ; init(goal); dfs(1); printf("There are %d routes from the firestation to streetcorner %d.\n",routes,goal); } return 0 ; }