UVA 208 Firetruck

 

直接回溯会超时,所以我们需要预处理一下,把所有与终点相连的点处理出来。

CODE:

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using  namespace std;

#define MAXN    30
vector< int> G[MAXN];

bool vis[MAXN];
int dist;
int fa[MAXN];
int flag[MAXN];
int tot;

void init_dfs( int u)      // 反向预处理 
{
    flag[u] =  1;
     for( int i =  0; i < G[u].size(); i++)
    {
         int v = G[u][i];
         if(!flag[v]) init_dfs(v);
    }
}

void dfs( int cur =  1)             //  正向查找
{
     if(fa[cur- 1] == dist)         //  结束条件
    {
         for( int j =  0; j < cur; j++) 
            printf(j != cur- 1" %d  ": " %d\n ", fa[j]);
        tot++;
    }
     else  for( int i =  0; i < G[fa[cur- 1]].size(); i++)
    {
         int v = G[fa[cur- 1]][i];
         if(flag[v] && !vis[v])
        {
            fa[cur] = v;         //  记录路径
            vis[v] =  1;
            dfs(cur+ 1);
            vis[v] =  0;
        }
    }
}

void init()
{
    tot =  0;
     for( int i =  0; i < MAXN; i++) G[i].clear();
    memset(vis,  0sizeof(vis));
    memset(flag,  0sizeof(flag));
    vis[ 1] =  1;
    fa[ 0] =  1;
}

int main()
{
     int times =  0;
     while(~scanf( " %d ", &dist))
    {
        init();
         int u, v;
         while(scanf( " %d%d ", &u, &v) && (u || v))
        {
            G[u].push_back(v);
            G[v].push_back(u);
        }
         for( int i =  0; i < MAXN; i++) sort(G[i].begin(), G[i].end());      //字典序输出
        init_dfs(dist);
        printf( " CASE %d:\n ", ++times);
        dfs();
        printf( " There are %d routes from the firestation to streetcorner %d.\n ", tot, dist);
    }
     return  0;
}

 

你可能感兴趣的:(uva)