题目:P3371【模板】单源最短路径
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1000005,M=1000005;
const long long inf=2147483647;
int to[M],last[M],tep[N],ans[M];
int num[N],t[N];
int n,m,nn=0;
int head,tail;
bool vis[N];
void add(int a,int b,int c)
{
nn++;
to[nn]=b;
ans[nn]=c;
tep[nn]=last[a];
last[a]=nn;
}
int main()
{
int u,v,l;
int s;
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&l);
add(u,v,l);
}
for(int i=0;i<=n;i++)
{
vis[i]=0;
num[i]=inf;
}
num[s]=0;
head=1; tail=1;
t[1]=s; vis[s]=1;
int k;
while (head<=tail)
{
k=last[t[head]];
vis[t[head]]=0;
for(int i=k;i!=0;i=tep[i])
{
if(num[t[head]]+ans[i]<num[to[i]])
{
num[to[i]]=num[t[head]]+ans[i];
if (vis[to[i]]==0)
{
vis[to[i]]=1;
tail++;
t[tail]=to[i];
}
}
}
head++;
}
for(int i=1;i<=n;i++)
printf("%d ",num[i]);
}