PTA甲级考试真题练习111——1111 Online Map

题目

在这里插入图片描述

思路

使用Dijkstra即可,使用DFS最后一个测试点会超时

代码

#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
const int nmax = 505;
const int inf = 2147483647;
int l[nmax][nmax],t[nmax][nmax];
int dis[nmax], dispre[nmax], weight[nmax], node[nmax],Time[nmax];
int n, m,src,tar;
int minl = inf, mint = inf;
int suml = 0, sumt = 0;
vector<int> vecl;
vector<int> vect;
bool visited[nmax];

void dj1() {
	for (int i = 0; i < n; ++i) {
		int	min_val = inf, u = -1;
		for (int j = 0; j < n; ++j) {
			if (!visited[j] && dis[j] < min_val) {
				min_val = dis[j];
				u = j;
			}
		}
		if (u == -1)
			break;
		visited[u] = true;
		for (int j = 0; j < n; ++j) {
			if (!visited[j] && l[u][j] != inf) {
				if (dis[u] + l[u][j] < dis[j]) {
					dis[j] = dis[u] + l[u][j];
					weight[j] = weight[u] + t[u][j];
					dispre[j] = u;
				}else if (dis[u] + l[u][j] == dis[j] && weight[u] + t[u][j] < weight[j]) {
					weight[j] = weight[u] + t[u][j];
					dispre[j] = u;
				}
			}
		}
	}
	int tmp = tar;
	while (tmp != src) {
		vecl.emplace_back(tmp);
		tmp = dispre[tmp];
	}
	vecl.emplace_back(src);
}
void dj2() {
	for (int i = 0; i < n; ++i) {
		int	min_val = inf, u = -1;
		for (int j = 0; j < n; ++j) {
			if (!visited[j] && Time[j] < min_val) {
				min_val = Time[j];
				u = j;
			}
		}
		if (u == -1)
			break;
		visited[u] = 1;
		for (int j = 0; j < n; ++j) {
			if (!visited[j] && t[u][j] != inf) {
				if (Time[u] + t[u][j] < Time[j]) {
					Time[j] = Time[u] + t[u][j];
					node[j] = node[u] + 1;
					dispre[j] = u;
				}else if (Time[u] + t[u][j] == Time[j] && node[u] + 1 < node[j]) {
					node[j] = node[u] + 1;
					dispre[j] = u;
				}
			}
		}
	}
	int tmp = tar;
	while (tmp != src) {
		vect.emplace_back(tmp);
		tmp = dispre[tmp];
	}
	vect.emplace_back(src);
}
int main()
{
	cin >> n >> m;
	memset(visited, 0, sizeof(visited));
	fill(l[0], l[0] + nmax * nmax, inf);
	fill(t[0], t[0] + nmax * nmax, inf);
	fill(dis, dis + n, inf);
	fill(weight, weight + n, inf);
	fill(Time, Time + n, inf);
	for (int i = 0; i < m; ++i) {
		int u, v, one_way;
		cin >> u >> v >> one_way;
		cin >> l[u][v] >> t[u][v];
		if (one_way == 0) {
			l[v][u] = l[u][v];
			t[v][u] = t[u][v];
		}
	}
	cin >> src>>tar;	
	dis[src] = 0;
	weight[src] = 0;
	dj1();
	memset(visited, 0, sizeof(visited));
	node[src] = 0;
	Time[src] = 0;
	dj2();
	if (vecl == vect) {
		cout << "Distance = " << dis[tar] << "; Time = " << weight[tar] << ": " << vecl[vecl.size()-1];
		for (int i = vecl.size()-2; i >= 0; --i)
			cout << " -> " << vecl[i];
	}else {
		cout << "Distance = " << dis[tar] <<": "<< vecl[vecl.size() - 1];
		for (int i = vecl.size() - 2; i >= 0; --i)
			cout << " -> " << vecl[i];
		cout << endl;
		cout << "Time = " << Time[tar] << ": " << vect[vect.size() - 1];
		for (int i = vect.size() - 2; i >= 0; --i)
			cout << " -> " << vect[i];
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值