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;
}
怎么今天不压行了
记录

浙公网安备 33010602011771号