题意:给出一个无向图,求节点1到给定节点的所有路径。
思路:因为要求所有路径,只能用DFS了。
注意:可能节点1到给定的节点不可达,需要先预处理判断是否可以到达,flyod算法求传递闭包即可。
PS:好久没写代码了,手太生了,犯了很多错误。。。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int adj[40][40],used[40],path[1000],d[40][40];
int D,node,cnt;
void dfs(int u, int dep)
{
path[dep] = u;
if(u == D){
for(int i = 0; i <= dep; ++i)
printf("%d%c",path[i],i == dep? '\n':' ');
cnt++;
return;
}
for(int i = 1; i <= node; ++i)
if(adj[u][i] && !used[i]){
used[i] = 1;
dfs(i,dep+1);
used[i] = 0;
}
return;
}
int main(void)
{
//freopen("input.txt","r",stdin);
int t = 1;
while(scanf("%d",&D) != EOF){
memset(adj,0,sizeof(adj));
memset(used,0,sizeof(used));
memset(d,0,sizeof(d));
int u, v = 0;
node = 1;
cnt = 0;
while(scanf("%d%d",&u,&v),u||v)
adj[u][v] = adj[v][u] = d[v][u] = d[u][v] = 1,node = max(node,max(u,v));
for(int k = 1; k <= node; ++k)
for(int i = 1; i <= node; ++i)
for(int j = 1; j <= node; ++j)
d[i][j] |= d[i][k] & d[k][j];
printf("CASE %d:\n",t++);
if(d[1][D] == 1){
used[1] = 1;
dfs(1,0);
}
else
cnt = 0;
printf("There are %d routes from the firestation to streetcorner %d.\n",cnt,D);
}
return 0;
}