AtCoder Beginner Contest 463 E - Roads and Gates 题解

msjing昨天手法建边然后假了

solve

  • 当时msjing看到了传送门&最短路高兴坏了

板板?!
——by msjing

  • 开始思考!
  • 暴力全建边,大概是\(O(n^2)\)的,不可行
  • 考虑转化,对于最短路算法,是把一堆权值加和,因此我们可以搞一个滚木虚空点(0 or n+1等,我用的0),在处理x时把去(i->0)的边权设为x,把回来(0->i)的边权设为x+Y,由于i->j都是一去一回,所以可以证明是等价于题目的,给张图吧
    无标题
  • 接下来就是最短路板子了,就没啥了
  • 有两点注意:spfa貌似会被卡(wang7979看起来是被卡了) && 空间开4倍
#include<bits/stdc++.h>
#define Honkai ios::sync_with_stdio(0);
#define StarRail cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
constexpr int maxn=2e6+10;
long long n,m,Y;
long long h[maxn],to[maxn],nxt[maxn],w[maxn],tot;
void add(long long x,long long y,long long z)
{
	tot++;
	to[tot]=y;
	nxt[tot]=h[x];
	h[x]=tot;
	w[tot]=z;
}
long long dis[maxn];
priority_queue<pair<long long,long long> > q;
bool v[maxn];
void dji(long long x)
{
	memset(dis,0x7f,sizeof(dis));
	dis[x]=0;
	q.push(make_pair(0,x));
	while (q.size())
	{
		x=q.top().second;
		q.pop();
		if (v[x]) continue;
		v[x]=1;
		for (long long i=h[x];i;i=nxt[i])
		{
			long long y=to[i];
			if (dis[y]>dis[x]+w[i])
			{
				dis[y]=dis[x]+w[i];
				q.push(make_pair(-dis[y],y));
			}
		}
	}
}
int main()
{
	Honkai StarRail
	cin >> n >> m >> Y;
	for (long long i=1;i<=m;i++)
	{
		long long x,y,z;cin >> x >> y >> z;
		add(x,y,z);add(y,x,z);
	}
	for (long long i=1;i<=n;i++)
	{
		long long x;cin >> x;
		add(i,0,x);add(0,i,x+Y);
	}
	dji(1);
	for (long long i=2;i<=n;i++) cout << dis[i] << " ";
	return 0;
}

怎么今天不压行了
记录

posted @ 2026-06-21 09:08  msjing  阅读(29)  评论(0)    收藏  举报