uva 208 Firetruck

注意可能有很多点,但是只有一条路与终点相通。不剪枝一定超时,所以先从终点开始
#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;
}

进行一次搜索,将相连的点标记一下。

你可能感兴趣的:(uva 208 Firetruck)