您的位置:首页 > 其它

uva 208 Firetruck

2017-09-24 17:00 393 查看
题目:Firetruck

思路:

先从终点开始遍历一次全图,找出和它连通的点。再从起点开始dfs,这是只能走标记过的那些和终点连通的点。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
#include<sstream>
#include<queue>
#include<set>
using namespace std;

#define maxn 21

bool mp[maxn+5][maxn+5];
int goal;
bool use[maxn+5]={0};
int cnt;
bool c[maxn+5]={0};

void cut(int x){
c[x]=true;
for(int i=1;i<maxn;i++){
if(mp[x][i]&&!c[i]) cut(i);
}
}

bool init(){
cnt=0;
memset(use,0,sizeof(use));
memset(mp,0,sizeof(mp));
memset(c,0,sizeof(c));
if(scanf("%d",&goal)!=1) return false;
int x,y;
while(scanf("%d%d",&x,&y)==2&&x!=0&&y!=0){
mp[x][y]=mp[y][x]=true;
}
return true;
}

void dfs(int x,vector<int> a){
if(x==goal){
for(int i=0;i<a.size();i++){
printf("%d ",a[i]);
}
printf("%d\n",goal);
cnt++;
return ;
}
a.push_back(x);
use[x]=true;
for(int i=1;i<maxn;i++){
if(mp[x][i]&&!use[i]&&c[i]){
dfs(i,a);
}
}
use[x]=false;
return ;
}

int main() {
int T=0;
while(init()){
printf("CASE %d:\n",++T);
cut(goal);
vector<int> x;
dfs(1,x);
printf("There are %d routes from the firestation to streetcorner %d.\n",cnt,goal);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva dfs