50,782
社区成员
发帖
与我相关
我的任务
分享
#include <bits/stdc++.h>
#define MOD 10000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int maxn=1000005;
int n,m,s;
//e存终点,w存权值,h存表头,next存下一个点(h和next形成了链表)
int idx,e[maxn],w[maxn],h[maxn],ne[maxn];
int dis[maxn],vis[maxn];//距离,标记
struct Node {
int dis,x;//距离和当前点
//重载运算符(将小于改为大于)
bool operator < (Node p) const {
return dis > p.dis;
}
Node(int dis,int x):dis(dis),x(x) {}
};
//邻接表
void add(int a,int b,int c) {
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
void dijkstra() {
memset(dis,INF,sizeof(dis));//初始化
priority_queue<Node> q;
dis[s]=0;
Node u(dis[s],s);
q.push(u);
while(!q.empty()) {
Node u=q.top ();
q.pop();
if(vis[u.x]) continue;
vis[u.x]=1;
for(int i=h[u.x]; i!=-1; i=ne[i]) {
if(dis[e[i]] > dis[u.x] + w[i]) {
dis[e[i]] = dis[u.x] + w[i];
Node v(dis[e[i]],e[i]);
q.push(v);
}
}
}
}
int main() {
memset(h,-1,sizeof(h));//
cin>>n>>m>>s;
for(int i=1; i<=m; i++) {
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
dijkstra();
for(int i=1; i<=n; i++) {
if(dis[i]==INF) cout<<"2147483647 ";
else cout<<dis[i]<<" ";
}
return 0;
}