不剪枝的话会TLE,因为节点最多有21个,回溯数据量还是很大。剪枝后AC通过时间15ms。。
剪枝的方法是统计出哪些节点是有效的,所谓有效是该指节点与目标节点是直接或间接相连的,也就是通过这个节点必然会有一条通路到达目标节点。
#include<iostream>
#include<cstring>
using namespace std;
int des,count,MaxSta,C[25];
bool vis[25],valid[25],path[25][25];
void dfs(int sta,int cur)
{
if (sta==des)
{
count++;
for (int i=0;i<cur;i++)
{
if (i!=cur-1)
cout<<C[i]<<" ";
else cout<<C[i]<<endl;
}
}
else{
for (int i=2;i<=MaxSta;i++)
{
if (!vis[i]&&path[sta][i]&&valid[i])
{
C[cur]=i;
vis[i]=1;
dfs(i,cur+1);
vis[i]=0;
}
}
}
}
void preprocess(int st)
{
valid[st]=1;
for (int i=1;i<=MaxSta;i++)
{
if (path[st][i]&&!valid[i])
preprocess(i);
}
}
int main()
{
int col=0;
while(cin>>des)
{
col++;
int a,b;
memset(path,0,sizeof(path));
MaxSta=0;
while (cin>>a>>b&&a)
{
int bigger=a>b?a:b;
if (bigger>MaxSta)
MaxSta=bigger;
path[a][b]=path[b][a]=1;
}
memset(vis,0,sizeof(vis));
memset(valid,0,sizeof(valid));
preprocess(des);
C[0]=1;
count=0;
cout<<"CASE "<<col<<":"<<endl;
dfs(1,1);
cout<<"There are "<<count<<" routes from the firestation to streetcorner "<<des<<"."<<endl;
}
return 0;
}