Welcome to Liukejie'|

liukejie

园龄:1年8个月粉丝:5关注:11

📂编程
🔖题解
2023-08-27 18:28阅读: 4评论: 0推荐: 0

SP34012 ADRABR - Adrita and Her Bike Ride 题解

题意

给出一个无向图,每条边的权值为 w+12,求最短路。

思路

最短路模板题,套用 dijkstra 模板即可。

注意事项

  • 建双向边。

  • 记得清空数组。

代码

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define rep(i, l, r) for(int i = l; i <= r; ++ i)
#define per(i, r, l) for(int i = r; i >= l; -- i)
#define me0(a); memset(a, 0, sizeof a);
#define me3(a); memset(a, 0x3f, sizeof a);
#define PII pair<int, int>
#define il inline

const int INF = 0x3f3f3f3f, MOD = 1e9 + 7;

il void read(int &n)
{
	bool w = 0;
	char c = getchar();
	for (; c < 48 || c > 57; c = getchar())
		w = c == 45;
	for (n = 0; c >= 48 && c <= 57; c = getchar())
		n = n * 10 + c - 48;
	n = w ? -n : n;
}

il void write(int x, char a)
{
	char c[40], s = 0;
	if (x < 0) putchar(45), x = -x;
	for (; x ;) c[s ++] = x % 10, x /= 10;
	if (!s) putchar(48);
	for (; s -- ;) putchar(c[s] + 48);
	putchar(a);
}

const int MAXN = 1000010;
int dist[MAXN];
bool vis[MAXN];
int n, m, s, t;

struct EDGE {int son, val;} edge;
vector<EDGE>V[MAXN];
inline void add(int x, int y, int z) {V[x].push_back({y, z});}

struct node {
	int dist, pos;
	bool operator<(const node&x)const {return x.dist < dist;}
};

il void dij(int s) {
	me0(vis); me3(dist);
	dist[s] = 0;
	priority_queue<node> q;
	q.push((node) {0, s});
	for (; !q.empty();) {
		node tmp = q.top();
		q.pop();
		int x = tmp.pos;
		if (vis[x]) continue;
		vis[x] = 1;
		for (auto i : V[x]) {
			int y = i.son, z = i.val;
			if (dist[y] > dist[x] + z) {
				dist[y] = dist[x] + z;
				if (!vis[y]) q.push((node) {dist[y], y});
			}
		}
	}
}
main()
{
	int Q;
	read(Q);
	for (; Q; --Q)
	{
		read(n); read(m); read(s); read(t);
		rep(i, 1, m)
		{
			int x, y, val;
			read(x); read(y); read(val);
			val += 12;
			add(x, y, val); add(y, x, val);
		}
		dij(s);
		write(dist[t], '\n');
	}
	return 0;
}
posted @   liukejie  阅读(4)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起