代码如下
读不懂私我啊
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N=100010;
const int INF=2147483647;
int n,m,st;
int a;
long long dis[N];
vector<int>son[N],side[N];
bool vis[N];
struct node{int id;};
bool operator <(node a,node b){return dis[a.id]>dis[b.id];}
priority_queue<node>now;
int read()
{
int s=0;
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch))
{
s=(s<<3)+(s<<1)+(ch^48);
ch=getchar();
}
return s;
}
void dij()
{
while(true)
{
int temp=now.top().id;
while(vis[temp] && !now.empty()) now.pop(),temp=now.top().id;
if(now.empty()) return;
now.pop();
vis[temp]=1;
for(int i=0;i<son[temp].size();++i) dis[son[temp][i]]=min(dis[son[temp][i]],dis[temp]+side[temp][i]),now.push(node{son[temp][i]});
}
}
int main()
{
n=read();
m=read();
st=read();
for(int i=1;i<=m;++i) a=read(),son[a].push_back(read()),side[a].push_back(read());
for(int i=1;i<=n;++i) dis[i]=INF;
dis[st]=0,now.push(node{st});
dij();
for(int i=1;i<=n;i++) cout<<dis[i]<<' ';
return 0;
}