L
u
o
g
u
l
i
n
k
Luogu~link
Luogu link
最短路
看先走到
P
A
1
PA_1
PA1近还是
P
A
2
PA_2
PA2近 记短的距离为
d
i
s
1
dis1
dis1
然后分别以更近的点为起点 走到另一个点 记距离为
d
i
s
2
dis2
dis2
答案即
d
i
s
1
+
d
i
s
2
dis1+dis2
dis1+dis2
s t l stl stl小根堆不要用 f i r s t first first存下标!!!
CODE:#include#include #include #include #include using namespace std; typedef long long ll; const int N=4e5+5; int n,m,st,e1,e2,tot,ans; int head[N],dis[N],vis[N]; priority_queue ,vector >,greater > > q; struct Edge{ int to,next,k; }a[N]; void add(int x,int y,int k) { a[++tot]=(Edge){y,head[x],k}; head[x]=tot; } void Dijkstra(int st) { memset(dis,0x7f,sizeof dis); memset(vis,0,sizeof vis); dis[st]=0; q.push(make_pair(0,st)); while(!q.empty()) { int x=q.top().second; q.pop(); if(vis[x]) continue; vis[x]=1; for(int i=head[x];i;i=a[i].next) { int qwq=a[i].to; if(dis[qwq]>dis[x]+a[i].k) { dis[qwq]=dis[x]+a[i].k; if(!vis[qwq]) q.push(make_pair(dis[qwq],qwq)); } } } } int main() { scanf("%d%d%d%d%d",&m,&n,&st,&e1,&e2); for(int i=1,x,y,k;i<=m;i++) { scanf("%d%d%d",&x,&y,&k); add(x,y,k); add(y,x,k); } Dijkstra(st); ans=min(dis[e1],dis[e2]); if(ans==dis[e1]) { Dijkstra(e1); ans+=dis[e2]; } else { Dijkstra(e2); ans+=dis[e1]; } printf("%d",ans); return 0; }



