UVA208

题目意思就是根据给出图,从1 到目标地点的路线有几条,是什么。

一开始普通回溯,超时了;

所以剪枝了一下,把不可到达目标地点的都给去掉了。(其实是把可到达的标记为可访问)

然后过了;


AC代码:


#include<iostream>
using namespace std;

const int N = 25;
int link[N][N];
int vis[N];
int vis2[N];
int target;
int num;
int city;
int res[N];
bool ok;
void init () {
	for (int i = 0 ; i < N ;i++) {
		for (int j = 0 ; j < N ;j++) {
			link[i][j] = 0;
		}
		vis[i] = 1;
		vis2[i] = 0;
	}
	num = 0;
	city = 0;
}
void setvis() {
	for (int i = 0 ; i < N ; i++) {
		for (int j = 0 ; j < N ;j++) {
			vis2[i] = 0;
		}
	}
}
void reach (int cur) {
	if (cur == target) {
		ok = true;
		return ;
	}
	for (int i = 1 ; i < N ; i++) {
		if (link[cur][i] && !vis2[i]) {
			vis2[i] = 1;
			reach(i);
		}
	}
}
void dfs(int cur ,int k) {
	if (cur == target) {
		num++;
		for (int i = 0 ; i < k ;i++) {
			if(i != 0)
				cout << " ";
			cout << res[i];
		}
		cout << endl;
		return;
	}
	for (int i = 1 ; i < N ; i++) {
		if (link[cur][i] && !vis[i]) {
			vis[i] = 1;
			res[k] = i;
			dfs(i,k + 1);
			vis[i] = 0;
		}
	}

}
int main () {
	int T = 1;
	int op ,ed;
	while (cin >> target) {
		init();
		while (cin >> op >> ed) {
			if (op + ed == 0)
				break;
			link[op][ed] = link[ed][op] = 1;
		}
		cout <<"CASE "<< T++<< ":"<<endl;
		vis2[1] = 1;
		res[0] = 1;
		for (int i = 1 ; i < N ; i++) {
			ok = false;
			setvis();
			reach(i);
			if(ok)
				vis[i] = 0;
		}
		vis[1] = 1;
		dfs(1,1);
		cout << "There are "<< num <<" routes from the firestation to streetcorner " << target << "." <<endl;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值