并不是所有的顶点都可以到达火灾现场,要从火灾现场开始遍历,找出可以到达火灾现场的所有顶点。再在这些顶点进行搜索。
另外,快排中,是取中点的元素,将数组分成两半,左边的都小于这个元素,右边的都大于这个元素。比较的时候是while(A[i]<m) i++; 而不是while(A[i]<A[m]) i++。A[m]的值是会改变的,现在要一个不会变的值将数组分成两半。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn=25;
int n,end,A[maxn],top,tot,p[maxn],m;
bool G[maxn][maxn],vis[maxn];
void travel(int u)
{
vis[u]=true;
p[m++]=u;
for(int i=1;i<=n;i++) if(G[u][i] && !vis[i])
travel(i);
}
void search(int u)
{
int i;
A[top++]=u;vis[u]=true;
if(u==end)
{
printf("%d",A[0]);
for(i=1;i<top;i++) printf(" %d",A[i]);
printf("\n");
tot++;
}else for(i=0;i<m;i++) if(G[u][p[i]] && !vis[p[i]])
search(p[i]);
top--;vis[u]=false;
}
void swap(int *a,int *b)
{
int t=*a;
*a=*b;
*b=t;
}
void Qsort(int *A,int p,int q)
{
int i=p,j=q,m=A[p+(q-p)/2];
do
{
while(A[i]<m) i++;
while(A[j]>m) j--;
if(i<=j)
{
swap(&A[i],&A[j]);
i++;j--;
}
}while(i<=j);
if(i<q) Qsort(A,i,q);
if(j>p) Qsort(A,p,j);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("208.txt","r",stdin);
#endif
int N=0;
while(scanf("%d",&end)==1)
{
printf("CASE %d:\n",++N);
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
int u,v;
n=0;
for(;;)
{
scanf("%d%d",&u,&v);
if(u==0 && v==0) break;
G[u][v]=G[v][u]=true;
if(u>n) n=u; if(v>n) n=v;
}
m=0;
travel(end);
Qsort(p,0,m-1);
top=tot=0;
memset(vis,0,sizeof(vis));
search(1);
printf("There are %d routes from the firestation to streetcorner %d.\n",tot,end);
}
return 0;
}