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

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;
}

 

posted on 2012-10-09 11:01  有间博客  阅读(171)  评论(0编辑  收藏  举报