直接回溯会超时,所以我们需要预处理一下,把所有与终点相连的点处理出来。
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, 0, sizeof(vis));
memset(flag, 0, sizeof(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;
}
#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, 0, sizeof(vis));
memset(flag, 0, sizeof(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;
}