int main() { int i,j,cases=1; while(1) { if(scanf("%d",&e)!=1) break; e--; for(i=0;i<MAXV;i++) for(j=0;j<MAXV;j++) g[i][j]=INF; maxv=0; while(1) { scanf("%d %d",&i,&j); if(i==0 && j==0) break; if(i>maxv) maxv=i; if(j>maxv) maxv=j; i--; j--; g[i][j]=1; g[j][i]=1; } printf("CASE %d:\n",cases++); num=0; for(i=0;i<maxv;i++) taken[i]=0; for(i=0;i<maxv;i++) dijkstra(i); taken[0]=1; btrack(0,0); printf("There are %d routes from the firestation to streetcorner %d.\n",num,e+1); } }
void btrack(int start,int p) { int i,j; if(start==e) { printf("1"); for(i=0;i<p;i++) printf(" %d",path[i]+1); printf("\n"); num++; return; } for(i=1;i<maxv;i++) { /* for all available street corners, check if there is a route from start * via i to end */ if(taken[i] || g[start][i]==INF) continue; for(j=1;j<maxv;j++) if(!taken[j] && distance[start][i]<INF && distance[i][e]<INF) goto goon; continue; goon: /* if(distance[i][e]==INF) continue;*/ taken[i]=1; path[p]=i; btrack(i,p+1); taken[i]=0; } }
int main (void){ int a[9]; scanf("%d",&cnum); while(cnum--){ max = 0; for(i = 0; i < 8; i++) for(j = 0; j < 8; j++) scanf("%u",&m[i][j]); btrack(a,0); printf("%5u\n",max); } return 0; }
void btrack(int a[], int k){ int c[8]; int cand = 8; int i; if(k == 8){ for(temp = i = 0; i < 8; i++) temp += m[i][a[i+1]]; if(temp > max) max = temp; } else { ++k; getcand(a,k,c,&cand); for (i = 0; i < cand; i++) { a[k] = c[i]; btrack(a,k); } } }