这代码标准版AC,这里t一个点
#include<bits/stdc++.h>
//#include<vector>
//#include<queue>
#define MAXN 100020
#define INF 2147483647
#define il inline
using namespace std;
vector<int> mp[MAXN];
vector<int> val[MAXN];
int dis[MAXN];
bool vis[MAXN];
int be,ed,x,y,z,n,m;
struct edge {
int sum,v;
};
bool operator < (edge a,edge b) {
return a.v>b.v;
}
priority_queue<edge> q;
il void read(int &x) {
char c=getchar();
x=0;
int f=0;
for(; !isdigit(c); c=getchar()) f|=(c=='-');
for(; isdigit(c); c=getchar()) x=((x<<3)+(x<<1)+(c^48));
x=f?-x:x;
}
il void Dijkstra(int u) {
for(int i=1; i<=n; i++) dis[i]=INF;
dis[u]=0;
edge h;
h.sum=u;
h.v=0;
q.push(h);
for(int j=1; j<=n; j++) {
while(vis[q.top().sum]) q.pop();
h=q.top();
vis[h.sum]=true;
for(int i=0; i<mp[h.sum].size(); i++) {
int d=mp[h.sum][i];
if(dis[d]>dis[h.sum]+val[h.sum][i]) {
dis[d]=dis[h.sum]+val[h.sum][i];
edge p;
p.sum=d;
p.v=dis[d];
q.push(p);
}
}
}
return ;
}
int main() {
read(n);
read(m);
read(be);//begin point
// scanf("%d",&ed);//end point
for(int i=1; i<=m; i++) {
// scanf("%d%d%d",&x,&y,&z);
read(x);
read(y);
read(z);
mp[x].push_back(y);
val[x].push_back(z);
}
// for(int i=1;i<=n;i++){
// printf("%d %d %d\n",be,i,dis[i]);
// }
Dijkstra(be);
for(int i=1; i<=n; i++) {
printf("%d ",dis[i]);
}
return 0;
}