您的位置:首页 > 其它

UVA - 208 Firetruck(floyd+DFS)

2017-08-09 10:47 387 查看
点击打开题目链接

题目大意:

给出一个无向图及节点n,求解从节点1 到节点n的所有路径,按字典序从小到大输出。

思路:

先用floyd算法求解连通关系,然后dfs求解。(连通关系也可以用并查集)

附上AC代码:

#include<iostream>
#include<cstring>

using namespace std;
int _map[25][25],path[25],used[25];
int n,u,v;
int _max,kase;

int dfs(int s,int dis){
int sum=0;
if(s==n){
for(int i=0;i<dis;i++){
if(i==0)cout<<path[0];
else cout<<' '<<path[i];
}
cout<<endl;
return 1;
}
for(int i=2;i<=_max;i++){
if(!used[i]&&_map[i]
&&_map[s][i]==1){
used[i]=1;
path[dis]=i;
sum+=dfs(i,dis+1);
used[i]=0;
}
}
return sum;
}

int main(){
kase=0;
ios::sync_with_stdio(false);
while(cin>>n){
_max=0;
memset(_map,0,sizeof(_map));
memset(path,0,sizeof(path));
memset(used,0,sizeof(used));
while(cin>>u>>v,u||v){
_map[u][v]=_map[v][u]=1;
if(u>_max)_max=u;
if(v>_max)_max=v;
}
for(int k=1;k<=_max;k++)
for(int i=1;i<=_max;i++)
for(int j=1;j<=_max;j++){
if(!_map[i][j]&&_map[i][k]&&_map[k][j])
_map[i][j]=2;
}
used[1]=1;
path[0]=1;
cout<<"CASE "<<++kase<<":"<<endl;
cout<<"There are "<<dfs(1,1)<<" routes ";
cout<<"from the firestation to streetcorner "<<n<<"."<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  floyd dfs