专栏文章
题解:P12780 [ICPC 2024 Yokohama R] Omnes Viae Yokohamam Ducunt?
P12780题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mio3xf9d
- 此快照首次捕获于
- 2025/12/02 12:57 3 个月前
- 此快照最后确认于
- 2025/12/02 12:57 3 个月前
妙妙推导题。
首先思考假设我们建了一个最小生成树,那么对于任意一条从 到首都的路径中的边 ,如果断开那么 绝对到不了首都,所以 其实是给任意一条从 到首都的路径中的边都增加了 的“贡献”,所以,题目所求就是( 指的是 的损失, 指的是 的脆弱度, 指的是从 到首都 的距离(以脆弱度为边)):
等等,这不就是……最短路吗?
是的,于是这道题就没了。
十年 OI 一场空,不开 long long 见祖宗!!
代码:
CPP#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
struct node
{
int x;
long long w;
bool operator<(const node&a)const
{
return w>a.w;
}
};
int a[N];
vector<node>e[N];
priority_queue<node>q;
long long d[N];
int vis[N];
signed main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i = 1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i = 1;i<=m;i++)
{
int x,y;
long long z;
scanf("%d %d %lld",&x,&y,&z);
e[x].push_back({y,z});
e[y].push_back({x,z});
}
memset(d,0x3f,sizeof(d));
q.push({1,0});
d[1] = 0;
while(q.size())
{
int x = q.top().x;
q.pop();
if(vis[x])
{
continue;
}
vis[x] = 1;
for(node v:e[x])
{
if(d[x]+v.w<d[v.x])
{
d[v.x] = d[x]+v.w;
q.push({v.x,d[v.x]});
}
}
}
long long ans = 0;
for(int i = 1;i<=n;i++)
{
ans+=(long long)a[i]*d[i];
}
printf("%lld",ans);
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...