网上找的代码,抱着看笑话的心里一交,结果真A了
#include<queue>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100010
using namespace std;
inline int p(int& x){ ++x; return x&=131071; }
inline bool gmin(int& x,int y){
return x>y?(x=y)|1:0;
}
struct edge{ int v,c,nt; } G[N<<2];
int n,m,s,cnt,d[N],h[N],in[N],c[N],q[1<<17];
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n;++i) d[i]=1<<30;
for(int x,y,c;m--;){
scanf("%d%d%d",&x,&y,&c);
G[++cnt]=(edge){y,c,h[x]}; h[x]=cnt;
}
d[s]=0; int l=0,r=0; q[++r]=s;
for(int x,t=1,j;l!=r;){
x=q[p(l)];
if(c[x]>t){ q[p(r)]=x; t+=20; continue; }
in[x]=0; j=l+1&131071;
for(int v,i=h[x];i;i=G[i].nt)
if(gmin(d[v=G[i].v],d[x]+G[i].c)){
if(!in[v]){
++c[x]; q[p(r)]=v; in[v]=1;
}
if(d[q[j]]>d[q[r]]) swap(q[j],q[r]);
}
}
for(int i=1;i<=n;++i) printf("%d ",d[i]);
}