uva208 Firetruck

来源:互联网 发布:python 命名实体 编辑:程序博客网 时间:2024/05/16 11:48

原题链接

解题思路:先用bfs判断可不可到达,能够到达再暴力搜索就OK了。
因为数据量很小,我使用的是邻接矩阵,这些可以保证字典序,如果使用邻接表,还要对每个vector节点进行排序。

#include<cstdio>#include<algorithm>#include<vector>#include<cstring>#include<queue>using namespace std;const int maxn=25;int v[maxn][maxn];int goal,tot=0;int ans[maxn],vis[maxn];inline void print(int cur){    printf("%d",ans[0]);    for(int i=1;i<=cur;i++){        printf(" %d",ans[i]);    }    printf("\n");}void dfs(int cur){    if(ans[cur]==goal){        tot++;        print(cur);        return;    }    for(int i=2;i<=20;i++){        if(!vis[i]&&v[ans[cur]][i]){            vis[i]=1;            ans[cur+1]=i;            dfs(cur+1);            vis[i]=0;        }    }}bool is_access(){    queue<int>q;    q.push(1);    vis[1]=1;    while(!q.empty()){        int temp=q.front();        q.pop();        if(temp==goal) return true;        for(int i=2;i<=20;i++){            if(!vis[i]&&v[temp][i]){                q.push(i);                vis[i]=1;            }        }    }    return false;}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int from,to,kase=0;    while(scanf("%d",&goal)==1){        tot=0;        memset(vis,0,sizeof(vis));        memset(v,0,sizeof(v));        while(true){            scanf("%d%d",&from,&to);            if(!from) break;            v[from][to]=v[to][from]=1;        }        printf("CASE %d:\n",++kase);        if(is_access()){            memset(vis,0,sizeof(vis));            ans[0]=1;            vis[1]=1;            dfs(0);        }        printf("There are %d routes from the firestation to streetcorner %d.\n",tot,goal);    }    return 0;}
0 0
原创粉丝点击