[ABC340D] Super Takahashi Bros.
考虑把这题转换为图论模型。
按照题意,就是 和 有一条长度为 的边, 和 有一条长度为 的边。
然后跑最短路即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
#define int long long
int n,dis[N];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
struct node{
int v,w;
};
vector<node> g[N<<1];
void Dijkstra(int s){
memset(dis,0x7f,sizeof(dis));
q.push({0,s}),dis[s]=0;
while(!q.empty()){
int u=q.top().second;
q.pop();
for(int i=0;i<g[u].size();i++){
int v=g[u][i].v,w=g[u][i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
q.push({dis[v],v});
}
}
}
cout<<dis[n]<<endl;
}
signed main(){
cin>>n;
for(int i=1,x,y,z;i<n;i++){
cin>>x>>y>>z;
g[i].push_back({z,y}),g[i].push_back({i+1,x});
}
Dijkstra(1);
}