专栏文章
[ABC340D] Super Takahashi Bros. 题解
AT_abc340_d题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqyu7vc
- 此快照首次捕获于
- 2025/12/04 12:58 3 个月前
- 此快照最后确认于
- 2025/12/04 12:58 3 个月前
一、思路
观察数据范围,发现 ,无法使用暴力求解
考虑建图后使用Dijkstra算法求解
题目要求连接相邻的两个关卡,所以可能出现重边的情况,在存储边时,仅保留最短的边
接下来在跑一遍迪杰斯特拉就可以了
二、代码
C#include<bits/stdc++.h>
#define int long long
using namespace std;
struct edge{
int u,v,w;
}e[500005];
int tot,n,h[500005],d[500005],vs[500005];
void add(int u,int v,int w){
e[++tot]={v,h[u],min(w,e[tot].w)};//存边时存最小的边
h[u]=tot;
}
priority_queue<pair<int,int> > q;
void dj(int st){//迪杰斯特拉
for(int i=1;i<=n;++i)d[i]=1e18;
d[st]=0;
q.push({0,st});
while(!q.empty()){
pair<int,int> now=q.top();
q.pop();
int u=now.second;
if(vs[u])continue;
vs[u]=1;
for(int i=h[u];i;i=e[i].v){
int v=e[i].u,w=e[i].w;
if(d[u]+w<d[v]){
d[v]=d[u]+w;
q.push({-d[v],v});
}
}
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=2*n+5;++i)e[i].w=1e18;//初始化权值
for(int i=1,a,b,x;i<n;++i){
cin>>a>>b>>x;
add(i,i+1,a);//按照题目要求建边
add(i,x,b);
}
dj(1);
cout<<d[n];
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...