208

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;


int mat[25][25];
int dist[25][25];
vector<int> vb[25];
bool visit[25];
int fire;
int kase=1;
int mx=0,cnt=0;
int res[25];

void dfs(int s,int k)
{

	if(s==fire)
	{
		cnt++;
		for(int i=0;i<k;i++)
		{
			cout<<res[i]<<(i==(k-1)?"\n":" ");
		}
		return;
	}
	//for(int i=0;i<vb[s].size();i++)
	for(int i=1;i<=mx;i++)
	{
		if(visit[i])
		continue;
		if(!mat[s][i])
		continue;
		if(!dist[i][fire])
		continue;

		visit[i]=1;
		res[k] = i;
		dfs(i,k+1);
		visit[i]=0;
		//int d = vb[s][i];
		//if(dist[s][d]==0)//
		//continue;
		//if(visit[d]==0)
		//{
			//visit[d]=1;
			//res[k]=d;
			//dfs(d,k+1);
			//visit[d]=0;
		//}
	}
}


void floyd()
{
	for(int i=1;i<=mx;i++)
	{
		for(int j=1;j<=mx;j++)
		{
			for(int k=1;k<=mx;k++)
			{
				if(dist[j][i]==1 && dist[i][k]==1)
					dist[j][k] = 1;
			}
		}
	}
}


int main()
{
	int a,b,k;

	for(int i=0;i<25;i++)
	{
		res[i] = 0;
	}
	while(scanf("%d",&fire)!=EOF)//cin>>fire
	{
		mx=0;
		memset(mat,0,sizeof(mat));
		memset(dist,0,sizeof(dist));
		while(cin>>a)
		{
			cin>>b;
			if(a==0 && b==0)
			{
				break;
			}

			dist[a][b]=1;
			dist[b][a]=1;

			mat[a][b]=1;
			mat[b][a]=1;
			//vb[a].push_back(b);
			//vb[b].push_back(a);
			mx = max(mx,max(a,b));
		}

		cnt=0;

		/*if(fire==1)
		{
			cout<<"There are "<<0<<" routes from the firestation to streetcorner "<<fire<<".\n";
		}*/
		//else
		memset(visit,0,sizeof(visit));
		visit[1]=1;
		k=0;
		res[k]=1;
		k+=1;
		floyd();
		//for(int i=1; i<=mx; i++)
		//sort(vb[i].begin(), vb[i].end());
		cout<<"CASE "<<kase++<<":\n";
		dfs(1,k);
		cout<<"There are "<<cnt<<" routes from the firestation to streetcorner "<<fire<<".\n";
	}


	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *