水题一个。
题意:给你一个图,求点1到某个点的所有路径,路径按照字典序输出。
方法:DFS暴搜,这里我用了并查集判断是否连接,减少不必要的运行时间,也可以用bfs检查就是麻烦一点。
代码还是一样的清晰。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=22;
int goal, num=0;
bool road[maxn][maxn];//连通路
int p[maxn];//并查集求连通块
int vis[maxn];//记录是否走过
int x, y;
int pass[maxn], cnt=0;//记录路径
int kase=0;
int Find(int u){
return u==p[u]? u: p[u]=Find(p[u]);
}
void clear(){
for(int i =0; i<maxn; ++i) p[i]=i;
memset(vis, 0, sizeof(vis));
memset(road, false, sizeof(road));
cnt=num=0;
}
void init(){
while(scanf("%d%d", &x, &y), x&&y){
road[x][y]=road[y][x]=true;
p[Find(x)]=Find(y);//并查集求连通块
}
}
void dfs(int now){
if(now==goal){
for(int i =0; i<cnt;++i)
printf("%d%c",pass[i], i==cnt-1? 10:32);
num++;
return;
}
for(int i =0; i<=maxn;++i){
if(road[now][i]==true &&vis[i]==false){
vis[i]=true;
pass[cnt++]=i;
dfs(i);
cnt--;
vis[i]=false;
}
}
}
int main(){
while(scanf("%d", &goal)!=EOF){
clear();//初始化函数
init();//读取函数
printf("CASE %d:\n", ++kase);
if(Find(1)==Find(goal)){
vis[1]=1;
pass[cnt++]=1;
dfs(1);
}
printf("There are %d routes from the firestation to streetcorner %d.\n", num, goal);
}
return 0;
}
AC代码: