蒟蒻求助~~~~~~~~~
#include<bits/stdc++.h>
using namespace std;
struct edge{
int next,to,w;
};
edge make(int next,int to,int w)
{
edge cur;cur.next=next;cur.to=to;cur.w=w;return cur;
}
vector<edge> g;
vector<int> head,dis;
vector<bool> vis;
int n,m,s,cnt;
template<typename T>
void read(T &x)
{
x=0;
register int f=1;
register char c=getchar();
while(!isdigit(c))
{
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c))
{
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
x*=f;
}
template<typename T>
inline void write(T x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>=10) write(x/10);
putchar(x%10+'0');
}
void add(int u,int v,int w)
{
g.push_back(make(head[u],v,w));
++cnt;
head[u]=cnt;
}
int main()
{
read(n);read(m);read(s);
for(int i=0;i<=n;++i)
{
dis.push_back(2147483647);
vis.push_back(0);
head.push_back(0);
}
dis[s]=0;
int u,v,w;
g.push_back(make(0,0,0));
for(int i=1;i<=m;++i)
{
read(u);read(v);read(w);
add(u,v,w);
}
int pnt=s,minn=2147483647;
while(!vis[pnt])
{
vis[pnt]=1;
for(int i=head[pnt];i;i=g[i].next)
if(!vis[g[i].to]&&dis[g[i].to]>dis[pnt]+g[i].w)
dis[g[i].to]=dis[pnt]+g[i].w;
for(int i=1;i<=n;++i)
if(!vis[i]&&dis[i]<minn)
{
minn=dis[i];
pnt=i;
}
}
for(int i=1;i<=n;++i)
{
write(dis[i]);
putchar(' ');
}
return 0;
}``