UVA208

题意:找出所有能到达目标地点的道路,最后输出总路线数

思路:刚开始看到之后觉得不难,就是DFS,然后回溯输出路线,但写完之后,交上去,就TLS,超时,看了下别人的题解,因为有21个结点,如果不剪枝会超时,所以先将与目标地点有关的点全部标记出来

           

#include<stdio.h> 
#include<string.h>
#define N 22 

int map[N][N], vis[N], a[N], b[N];
int n, x, y, cnt, t = 0, d;

void judge(int k){
	b[k] = 1;	
	for(int i = 1; i < N; i++)
		if (map[k][i] && !b[i])	
			judge(i);	
}

void dfs(int m){	
	if(m == n){	
		cnt++;
		printf("1");		
		for(int i = 1; i < d; i++)	
			printf(" %d", a[i]);
		printf("\n");	
	}	
	for(int i = 1; i < N; i++){	
		if ((map[m][i] == 1 || map[i][m] == 1) && !vis[i] && b[i]){		
			a[d++] = i; 	
			vis[i] = 1;			
			dfs(i);	
			vis[i] = 0;	
			d--;	
		}
	}		
	return;
  }
int main(){
	while (scanf("%d", &n) != EOF){
		memset(map, 0, sizeof(map));	
		memset(vis, 0, sizeof(vis));
		memset(b, 0, sizeof(b));
		while (scanf("%d%d", &x, &y) && x && y){
				map[x][y] = 1;	
				map[y][x] = 1;	
		}		
		cnt = 0, d = 0;		
		a[d++] = 1;	
		printf("CASE %d:\n", ++t);	
		vis[1] = 1;		
		judge(n);	
		dfs(1);
		printf("There are %d routes from the firestation to streetcorner %d.\n", cnt, n);	
	}	
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值