POJ1724:寻路问题

该题是个图论
使用邻接表存放图
使用DFS搜索解决;但尤其注意需要剪枝

#include<iostream>
#include<vector>
#include<cstring>
#include<math.h>
using namespace std;
int K, N, R;
struct Road {
	int d, L, t;
};
//使用邻接表存放图
vector<vector<Road>> G(110);					//一维vector代表的是城市、二维代表的是该城市的道路;由于每个城市的道路数量不确定,所以使用vector类

int minL[110][10010];						//minL[i][j]:起点走到城市i且此时花了j块钱的最小路径
int minLen;
int totalLen;
int totalCost;
int visited[110];

void dfs(int s) {
	if (s == N) {
		minLen = min(totalLen, minLen);
	}
	//DFS该城市的每一条道路
	for (int i = 0; i < G[s].size(); i++) {
		Road r = G[s][i];		//每个城市的道路
		if (r.t + totalCost <= K && visited[r.d] == 0) {
			if (totalLen + r.L >= minLen)				//最优性剪枝
				continue;
			if (totalLen + r.L > minL[r.d][totalCost + r.t])			//记忆性剪枝
				continue;
			minL[r.d][totalCost + r.t] = totalLen + r.L;				//更新记忆值
			totalLen += r.L;
			totalCost += r.t;
			visited[r.d] == 1;
			dfs(r.d);
			visited[r.d] == 0;
			totalLen -= r.L;
			totalCost -= r.t;
		}
	}
}
int main() {
	//输入数据
	cin >> K >> N >> R;
	Road r;
	for (int i = 0; i < R; i++) {
		int s;
		cin >> s >> r.d >> r.L >> r.t;
		if (s != r.d) {
			G[s].push_back(r);
		}
	}
	//数据初始化
	memset(visited, 0, sizeof(visited));
	for (int i = 0; i < 110; i++)
		for (int j = 0; j < 10010; j++)
			minL[i][j] = 10000;
	minLen = 10000;
	int totalLen = 0;
	int totalCost = 0;

	dfs(1);
	if (minLen == 10000)
		cout << -1;
	else
		cout << minLen;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值