专栏文章
【自用】关于严格次短路
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqg0cwo
- 此快照首次捕获于
- 2025/12/04 04:11 3 个月前
- 此快照最后确认于
- 2025/12/04 04:11 3 个月前
CPP
#include<bits/stdc++.h>
#include<queue>
using namespace std;
int n,r,p1[5002],p2[5002];
vector<pair<int,int> > G[5002];
priority_queue<pair<int,int> > q;
int main(){
cin>>n>>r;
for(int i=1;i<=n;i++)p1[i]=p2[i]=1073741823;
for(int i=1;i<=r;i++){
int u,v,w;
cin>>u>>v>>w;
G[u].push_back(make_pair(w,v));
G[v].push_back(make_pair(w,u));
}
q.push(make_pair(0,1));
p1[1]=0;
while(!q.empty()){
pair<int,int> pr=q.top();
q.pop();
int u=pr.second,z=pr.first;
if(z>p2[u])continue;
for(int i=0;i<G[u].size();i++){
int v=G[u][i].second,w=G[u][i].first;
if(p1[u]+w<=p1[v]){
p1[v]=p1[u]+w;
q.push(make_pair(p1[v],v));
}
else if(p1[u]+w<p2[v]){
p2[v]=p1[u]+w;
q.push(make_pair(p2[v],v));
}
if(p2[u]+w<p2[v]){
p2[v]=p2[u]+w;
// q.push(make_pair(p2[v],v));
}
}
}
cout<<p2[n]<<endl;
return 0;
}
为什么
if(p2[u]+w<p2[v]) 不需要 q.push(make_pair(p2[v],v))?因为前面已经执行过
if(p1[u]+w<=p1[v]) 和 else if(p1[u]+w<p2[v]) 了。如果前面两个的其中一个满足,那么自然会将 添加到 里;如果前面两个不满足,那就是说连 的最短路都无法更新 的次短路,因此 if(p2[u]+w<p2[v]) 不可能满足。相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...