52分求救
查看原帖
52分求救
633454
LLL789楼主2024/10/26 10:19
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int N=1e5+5;
const int M=2e5+5;
int n,m;//点数,边数 
int p[N],rk[N];//并查集维护连通性 
struct edge{//邻接表中的边 
	int v;//指向的点 
	long long w;//边权 
};
struct node{//为进行堆优化而建的结构体 
	int id;//节点编号
	long long len;//最短路估计,实际上存的是d[id]的值 
	bool operator < (const node &a) const{
		return len > a.len;//重载运算符(反向重载)
	}
};
vector<edge> h[N];
long long d[N];//某点到原点的最短距离(最短路估计) 
bool f[N];//记录某点是不是蓝点 
priority_queue<node> q;//堆优化(已经重载成小根堆) 
int pre[N];//每个点的前驱,实际上记录了最短路径上的点 

void pnt(int x){
	if(pre[x]){//x有前驱 
		pnt(pre[x]);
	}
	printf("%d ",x);
}
int s;
int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;i++){
		int u2,v2;
		long long w2;
		scanf("%d%d%lld",&u2,&v2,&w2);
		h[u2].push_back(edge{v2,w2});
		h[v2].push_back(edge{u2,w2});//无向图双向建边 
		
	}
	d[s]=0;//s是原点 
	for(int i=1;i<=n;i++){
		if(i == s) continue;
		d[i]=100000000000000000;//其余点的d初始化为无穷大 
	}
	q.push(node{s,0});
	while(!q.empty()){
		int u=q.top().id;
		q.pop();
		if(f[u]) continue;
		f[u]=1;
		for(int i=0;i<h[u].size();i++){
			int v2=h[u][i].v;
			long long w2=h[u][i].w;
			if(d[u]+w2 < d[v2]){
				d[v2]=d[u]+w2;
				q.push(node{v2,d[v2]}); 
			}
		}
	}
	for(int i=1;i<=n;i++){
		printf("%lld ",d[i]);
	}
	return 0;
}
2024/10/26 10:19
加载中...