社区讨论
44分啊呜呜
P4779【模板】单源最短路径(标准版)参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mixv3p05
- 此快照首次捕获于
- 2025/12/09 08:48 3 个月前
- 此快照最后确认于
- 2025/12/11 21:21 3 个月前
CPP
#include<cstdio>
#include<vector>
#include<queue>
#include<utility>
using namespace std;
int n,m,s,u,v,cur;
long long val;
priority_queue<pair<long long,int>,vector<pair<long long,int>>,greater<pair<long long,int>>> min_heap;
pair<long long,int> p;//这个排堆 <距离,节点>
vector<pair<long long,int>> graph[100001];//邻接表i到{distance,tag}
long long d[100001];//最短长度
bool z[100001];//是否已调用
bool crazy;
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n;i++){
z[i]=false;
d[i]=1e18;
}
for(int i=1;i<=m;i++){
scanf("%d%d%lld",&u,&v,&val);
graph[u].push_back({val,v});
graph[v].push_back({val,u});
}
cur=s;//标记当前更新
d[s]=0;
min_heap.push({0,s});
while(!min_heap.empty()){
p=min_heap.top();
min_heap.pop();
if(p.first>d[p.second]) continue;
if(!z[p.second]){
z[p.second]=true;
cur=p.second;
}
else continue;
for(int j=0;j<graph[cur].size();j++){//遍历cur的所有边
if(z[graph[cur][j].second]) continue;//已选取则跳过
long long temp=d[cur]+graph[cur][j].first;//temp是当前更新长度
if(temp<d[graph[cur][j].second]){
min_heap.push({temp,graph[cur][j].second});//更新
d[graph[cur][j].second]=temp;
}
}
}
for(int i=1;i<=n;i++){
printf("%lld ",d[i]);
}
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...