注意可能有很多点,但是只有一条路与终点相通。不剪枝一定超时,所以先从终点开始
进行一次搜索,将相连的点标记一下。
#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;
}
进行一次搜索,将相连的点标记一下。