原諒我這個用stl的醜陋的版本
可以用。
建議在允許O2優化的比賽使用。
//dijkstra
//MuYun
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
priority_queue <pair<int,int> > q;
int vet[20000],val[20000],vis[20000],head[20000],next[20000];
int edgenum;
inline void add(int x,int y,int value){
vet[++edgenum]=y;
val[edgenum]=value;
next[edgenum]=head[x];
head[x]=edgenum;
}
int d[20000];
void dijkstra(int root){
memset(d,0x3f,sizeof d);
memset(vis,0,sizeof vis);
d[root]=0;
q.push(make_pair(0,root));
while(!q.empty()){
int u=q.top().second;q.pop();
if(vis[u])
continue;
vis[u]=1;
for(int e=head[u];e;e=next[e]){
int v=vet[e],value=val[e];
if(d[v]>d[u]+value)
d[v]=d[u]+value;
q.push(make_pair(-d[v],v));
}
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
int x,y,value;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&value);
add(x,y,value);
}
dijkstra(1);
for(int i=1;i<=n;i++)
printf("%d ",d[i]);
printf("\n");
}