uva208

//兴高采烈的敲完了回溯代码,哈哈哈!!!

//什么?我不相信,我明明回溯了,为什么会超时呢?为什么,提交了两次都超时了大哭

//果然还是做了无用功!!其实重要的原因还是把不能到达目的地的点也递归了!!!其实只要先初始化一下,从后面开始标志可以到达目的地的点,然后在开始递归就可以了

#include <stdio.h>
#include <string.h>
int a[30][30],b[30];
int n,m,num,vis[30],can[30];
void init(int x)
{
	int i;
	for(i=2;i<=m;i++)
		if(a[x][i]&&!can[i])
		{
			can[i]=1;
			init(i);
		}
}
void dfs(int x,int cur)
{
	int i;
	if(x==n)
	{
		for(i=0;i<cur;i++)
		{
			if(i!=0)printf(" ");
			printf("%d",b[i]);
		}
		printf("\n");
		num++;
		return ;
	}
	for(i=2;i<=m;i++)
		if(a[x][i]&&!vis[i]&&can[i])
		{
			vis[i]=1;
			b[cur]=i;
			dfs(i,cur+1);
			vis[i]=0;
		}
}
main()
{
	int u,v,count=1;
	//freopen("D:\\o.txt","r",stdin);
	while(scanf("%d",&n)!=EOF)
	{
		memset(a,0,sizeof(a));
		memset(vis,0,sizeof(vis));
		memset(can,0,sizeof(can));
		while(1)
		{
			scanf("%d%d",&u,&v);
			if(u==0&&v==0)break;
			if(u>m)m=u;
			if(v>m)m=v;
			a[u][v]=a[v][u]=1;
		}
		printf("CASE %d:\n",count++);
		b[0]=1;
		num=0;
		init(n);
		dfs(1,1);
		printf("There are %d routes from the firestation to streetcorner %d.\n",num,n);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值