这道题没有什么难度,题目已经告诉了,要预先判断能不能够到达,否则会超时,笔者用的是简单的并查集来判断的,当然也可以用终点来一次bfs,判断每个点是否能够到达终点,然后没有什么太大的问题,要注意一个节点不能够走两次,应该是道暴力水题。
#include<bits/stdc++.h>
using namespace std;int CanTo[30], vis[30], CT[30];
int ans;
vector<int> web[30], path;
int findf(int num){
if(CanTo[num] == num)
return num;
else
return findf(CanTo[num]);
}
void add(int a, int b){
CanTo[findf(a)] = findf(b);
}
void dfs(int st, int ed){
// printf("==%d %d==\n", st, ed);
if(st == ed){
for(size_t i = 0; i < path.size(); ++i){
if(i)
printf(" ");
printf("%d", path[i]);
}
printf("\n");
++ans;
return ;
}
for(size_t i = 0; i < web[st].size(); ++i){
if(CT[web[st][i] ] && !vis[web[st][i] ]){
vis[st] = true;
path.push_back(web[st][i]);
dfs(web[st][i], ed);
path.pop_back();
vis[st] = false;
}
}
}
int main(){
int ed;
int cs = 0;
while(~scanf("%d", &ed)){
for(int i = 0; i < 30; ++i)
web[i].clear();
for(int i = 0; i < 30; ++i)
CanTo[i] = i;
printf("CASE %d:\n", ++cs);
int x, y;
ans = 0;
while(~scanf("%d %d", &x, &y) && (x || y)){
add(x, y);
web[x].push_back(y);
web[y].push_back(x);
}
if(findf(1) == findf(ed)){
memset(vis, 0, sizeof(vis));
memset(CT, 0, sizeof(CT));
for(int i = 0; i < 30; ++i)
sort(web[i].begin(), web[i].end());
path.clear();
path.push_back(1);
for(int i = 2; i < 30; ++i)
if(findf(i) == findf(ed))
CT[i] = 1;
dfs(1, ed);
}
printf("There are %d routes from the firestation to streetcorner %d.\n", ans, ed);
}
return 0;
}