Dijkstra算法模板

130 阅读1分钟
#include <iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define re register
using namespace std;
inline int read(){//快读
 int x=0,w=1;char c=getchar();
 while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
 while(c>'0'&&c<'9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
 return x*w;
}
struct Edge{
 int v,w,nxt;
}e[500010];
int head[10010],cnt=0;
inline void addedge(int u, int v, int w){
 e[++cnt].v=v;
 e[cnt].w=w;
 e[cnt].nxt=head[u];
 //nxt记录的是同起点的之前一条边的cnt值,cnt唯一标识一条边
 head[u]=cnt;//cnt相当于领接表的下标
}
int n,m,s;
int dis[100010];
struct node{
 int u,d;//重载
 bool operator<(const node&rhs) const{
 //固定格式 用地址进行操作rhs代表第二个
 return d>rhs.d;}	
};
inline void Dijkstra(){
 for(re int i=0;i<n;i++) dis[i]=2147483647;//重要的初始化
 dis[s]=0;//重要的初始化
 priority_queue<node> Q;//优先队列(小根堆)
 Q.push ((node){s,0});//向队列Q中压入node型元素,该元素u=s,d=0;
 while(!Q.empty()){
 	node fr=Q.top();Q.pop();
 	int u=fr.u,d=fr.d;
 	if(d!=dis[u]) continue;
 	for(re int i=head[u];i;i=e[i].nxt){
 		int v=e[i].v,w=e[i].w;
 		if(dis[u]+w<dis[v]){
 			dis[v]=dis[u]+w;
 			Q.push((node){v,dis[v]});
 		}
 	}
 }
}
int main(){
 n=read(),m=read(),s=read();
 for(re int i=1;i<=m;i++){
 	int x=read(),y=read(),z=read();
 	addedge(x,y,z);
 }
 Dijkstra();
 for(re int i=1;i<=n;i++) printf("%d",dis[i]);
 return 0;
}