社区讨论

WA?悬关

CF20CDijkstra?参与者 3已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@lo24rdhn
此快照首次捕获于
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;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...