uva 208 Firetruck

来源:互联网 发布:爱奇艺网络大电影票房 编辑:程序博客网 时间:2024/06/03 17:17

题目: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 21bool 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;}


原创粉丝点击