看完大神http://blog.csdn.net/shuangde800/article/details/7750427 的博客才知道TLE的原因:
从1(firestation)出发的路,并不一定能到达火灾处!
应该从1出发,只走能通向火灾处的路。
#include<stdio.h>
#include<string.h>
int tlroutes;
int fire;
int gra[25][25];
bool connected[25];
bool used[25]; //id(i.e. streetcorner) -> already visited or not
int queue[10000];
int route[25];
void dfs(int cur)
{
if(route[cur-1] == fire)
{
tlroutes++;
printf("%d",route[0]);
for(int i=1; i < cur; i++)
{
printf(" %d",route[i]);
}
putchar(10);
return;
}
for(int v=1; v < 25; ++v)
{
if(gra[route[cur-1]][v] && connected[v] && !used[v])
{
used[v] = true;
route[cur] = v;
dfs(cur+1);
used[v] = false;
}
}
}
int main()
{
//
int numcase = 1;
freopen("input.txt","r",stdin);
while(scanf("%d", &fire) == 1)
{
printf("CASE %d:\n",numcase++);
memset(gra, 0, sizeof(gra));
connected[fire] = true;
int u,v;
while(scanf("%d%d", &u, &v)==2)
{
if(!u&&!v)
break;
gra[u][v] = gra[v][u] = 1;
}
//bfs
memset(connected, false, sizeof(connected));
int start = 0, end = 1;
queue[start] = fire;
connected[fire] = true;
while(start < end)
{
for(int g=1; g < 25; ++g)
{
if(gra[queue[start]][g] && !connected[g])
{
connected[g] = true;
queue[end++] = g;
}
}
++start;
}
//dfs
memset(used, false, sizeof(used));
route[0] = 1; // cur == 0
used[1] = true;
tlroutes = 0;
dfs(1);
printf("There are %d routes from the firestation to streetcorner %d.\n",\
tlroutes, fire);
}
}