dijkstra——单源最短路径(标准版)

(洛谷):dijkstra——单源最短路径(标准版)

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> PII;
const int N=114514;
int n,m;
struct Edge{
	int val,end,nex;
}edge[2*N];
int cnt=1,head[N];
void add_edge(int beg,int end,int val){
	edge[cnt].end=end;
	edge[cnt].val=val;
	edge[cnt].nex=head[beg];
	head[beg]=cnt;
	cnt++;
	//多条重复边需作特别判断 
	return;
}
int dis[N];
void dijkstra(int begin){
	bool vis[N];
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	priority_queue<PII,vector<PII>,greater<PII> >prique;
	prique.push(make_pair(0,begin));
	dis[begin]=0;
	while(!prique.empty()){
		int dis_tmp=prique.top().first;
		int pos=prique.top().second;
		prique.pop();
		if(vis[pos])continue;
		vis[pos]=1;
		for(int i=head[pos];i!=0;i=edge[i].nex){
			int p=edge[i].end;
			if(dis[p]>edge[i].val+dis_tmp){
				dis[p]=edge[i].val+dis_tmp;
				prique.push(make_pair(dis[p],p));
			}
		}
	}
	return;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int s;
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add_edge(u,v,w);
	}
	dijkstra(s);
	for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
	cout<<endl;
	return 0;
}
posted @ 2025-11-26 13:52  10mbps_十兆網路  阅读(9)  评论(0)    收藏  举报