社区讨论
Dijkstra求助
学术版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo24rn9m
- 此快照首次捕获于
- 2023/10/23 07:59 2 年前
- 此快照最后确认于
- 2023/11/03 08:17 2 年前
写挂了
CPP#include<bits/stdc++.h>
using namespace std;
long long res[100005];
vector<pair<int,int> >v[100005];
set<pair<int,int> >all;
int _prev[100005],mark[100005];
int out(int x){
if(x != 0) out(_prev[x]);
printf("%d ",x+1);
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);a--;b--;
v[a].push_back(make_pair(b,c));
v[b].push_back(make_pair(a,c));
}
memset(res,LONG_LONG_MAX,sizeof(res));
memset(mark,-1,sizeof(mark));
mark[0] = 1;
res[0] = 0;
all.insert(make_pair(0,0));
while(!all.empty()){
int i = all.begin()->second;
long long d = all.begin()->first;
all.erase(all.begin());
mark[i] = 2;
for(int j=0;j<v[i].size();j++){
int k = v[i][j].first;
long long D = d + v[i][j].second;
if(mark[k] == 0 || mark[k] == 1 && D < res[k]){
if(mark[k] == 1) all.erase(make_pair(res[k],k));
mark[k] = 1;
res[k] = D;
_prev[k] = i;
all.insert(make_pair(D,k));
}
}
}
if(mark[n-1] == 2) out(n-1); else printf("-1");
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...