【TLE剪枝】UVa208救火车

来源:互联网 发布:语音广播软件 编辑:程序博客网 时间:2024/05/16 18:20

看完大神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 notint 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;}//bfsmemset(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;}//dfsmemset(used, false, sizeof(used));route[0] = 1;  // cur == 0used[1] = true;tlroutes = 0;dfs(1);printf("There are %d routes from the firestation to streetcorner %d.\n",\tlroutes, fire);}}


原创粉丝点击