描述:用dfs求路径,单纯的回溯是无法通过的,会超时,需要优化一下,然后才能过
#include <cstdio>
#include <cstring>
#include <cstdlib>
int n,max,route,len;
int num[110][110],score[110],flag[110],str[110];
int cmp(const void *p1,const void *p2)
{
return *(int *) p1- *(int *) p2;
}
void count_num(int pos)
{
flag[pos]=1;
str[len++]=pos;
for(int i=1;i<=max;i++)
if(!flag[i]&&num[pos][i]) count_num(i);
}
void dfs(int cur,int pos)
{
if(score[cur-1]==n)
{
printf("%d",score[0]);
for(int i=1; i<cur; i++) printf(" %d",score[i]);
printf("\n");
route++;
return;
}
for(int i=0;i<len;i++)
if(num[pos][str[i]]&&!flag[str[i]])
{
score[cur]=str[i];
flag[str[i]]=1;
dfs(cur+1,str[i]);
flag[str[i]]=0;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.txt","r",stdin);
#endif
int count=0;
while(scanf("%d",&n)!=EOF)
{
memset(num,0,sizeof(num));
memset(str,0,sizeof(str));
int x,y;
max=route=len=0;
while(scanf("%d%d",&x,&y)!=EOF)
{
if(!x&&!y) break;
num[x][y]=num[y][x]=1;
if(max<x) max=x;
if(max<y) max=y;
}
memset(flag,0,sizeof(flag));
count_num(n);
qsort(str,len,sizeof(int),cmp);
memset(flag,0,sizeof(flag));
printf("CASE %d:\n",++count);
flag[1]=1;
score[0]=1;
dfs(1,1);
printf("There are %d routes from the firestation to streetcorner %d.\n",route,n);
}
return 0;
}
208 - Firetruck
最新推荐文章于 2019-09-10 21:33:49 发布