OJ:https://cn.vjudge.net/problem/UVA-208
简单的翻译,在一个城市中,也就是一个无向图,有一个消防队,其在这个城市的1号位置,其他位置全是居民楼,一个这个城市中最多有20个位置,给定某一个位置发生火灾,要求我们给出从消防队到当前位置的所有路径,且路径是按照字典序向后进行输出。
其实根据图中的说明,我们容易就能想到这是一个简单的DFS题目,即能得到路径,按照顺序搜索就能得到字典序。十分满足条件
但是如果只用dfs应该通过不了,还需要用到并查集,如果两个点之间没有连接,直接不用进行搜索,节省时间。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 25
int count;
int u[MAX];
void dfs(int map[MAX][MAX],int index,int target,int visited[MAX],int res[MAX],int l){
if(index == target){
int i=0;
printf("1");
for(;i<l;i++){
printf(" %d",res[i]);
}
printf("\n");
count++;
return;
}
int i=2;
for(;i<=MAX;i++){
if(map[index][i] && !visited[i]){
res[l] = i;
visited[i] = 1;
dfs(map,i,target,visited,res,l+1);
visited[i] = 0;
}
}
}
int find(int x){
while(u[x] != x){
u[x] = u[u[x]];
x = u[x];
}
return x;
}
void connect(int x,int y){
int l = find(x);
int r = find(y);
u[r] = l;
}
int isConnected(int x,int y){
return find(x) == find(y);
}
int main()
{
int n;
int map[MAX][MAX];
int k = 1;
int visited[MAX];
int res[MAX];
while(scanf("%d",&n) == 1){
int i=0;
for(;i<MAX;i++){
u[i] = i;
}
count = 0;
memset(map,0,sizeof(map));
int x,y;
do{
scanf("%d%d",&x,&y);
map[x][y] = map[y][x] = 1;
connect(x,y);
}while(x !=0 && y != 0);
printf("CASE %d:\n",k++);
if(isConnected(1,n)){
memset(visited,0,sizeof(visited));
visited[1] = 1;
dfs(map,1,n,visited,res,0);
}
printf("There are %d routes from the firestation to streetcorner %d.\n",count,n);
}
return 0;
}