社区讨论

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 条回复,欢迎继续交流。

正在加载回复...