【题目】
传送门
【程序】
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
const int INF=2147483647;
int tot,head[N],dis[N];
bool visit[N];
typedef pair<int,int> pr;
set<pr> q;//建小根堆
struct kkk{int to,ne,w;}e[N*2];
void add(int x,int y,int w)
{
e[++tot]=(kkk){y,head[x],w};
head[x]=tot;
}
int main()
{
int n,m,s;
scanf("%d%d%d",&n,&m,&s);
for(int i=1; i<=m; i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
for(int i=1; i<=n; i++)dis[i]=INF;
dis[s]=0;
q.insert(make_pair(dis[s],s));
while(!q.empty())
{
pr u=*(q.begin());
q.erase(u);
int wz=u.second;
visit[wz]=true;
for(int i=head[wz]; i; i=e[i].ne)
{
int v=e[i].to,w=e[i].w;
if(visit[v])continue;
if(dis[wz]+w<dis[v])
{
q.erase(make_pair(dis[v],v));
dis[v]=dis[wz]+w;
q.insert(make_pair(dis[v],v));
}
}
}
for(int i=1; i<=n; i++) printf("%d ",dis[i]);
return 0;
}