uva 208 Firetruck

来源:互联网 发布:视频上课软件 编辑:程序博客网 时间:2024/05/17 23:34
注意可能有很多点,但是只有一条路与终点相通。不剪枝一定超时,所以先从终点开始
#include "stdio.h"#include "string.h"int ans,sum,vis[25][25],cnt,v[25],c[25],ok[25];void pdfs(int st)//从后面开始搜索,标记所以可能的点{    int i;    for(i=0;i<25;i++)     if(vis[st][i]&&!ok[i])    {        ok[i]=1;        pdfs(i);    }}void dfs(int st,int t){    int i;    if(st==ans)    {        cnt++;        for(i=1; i<t; i++) printf("%d ",v[i]);        printf("%d\n",ans);        return;    }    for(i=1; i<22; i++)    {        if(vis[st][i]&&!c[i]&&ok[i])        {            c[i]=1;            vis[st][i]= vis[i][st]=0;            v[t]=st;            dfs(i,t+1);            vis[st][i]= vis[i][st]=1;            c[i]=0;        }    }}int main(){    int a,b,cas=0;    while(~scanf("%d",&ans))    {        memset(vis,0,sizeof(vis));        memset(c,0,sizeof(c));        memset(ok,0,sizeof(ok));        while(scanf("%d%d",&a,&b))        {            if(a==0&&b==0) break;           vis[b][a]= vis[a][b]=1;        }        printf("CASE %d:\n",++cas);        cnt=0;        pdfs(ans);        c[1]=1;        dfs(1,1);        printf("There are %d routes from the firestation to streetcorner %d.\n",cnt,ans);    }    return 0;}

进行一次搜索,将相连的点标记一下。
0 0
原创粉丝点击