Dijkstra 模板
讲解请参考这位大佬的博客:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html
#include <stdio.h> #include <algorithm> #include <cstring> #include <cmath> using namespace std; const int inf=2147483647; const int maxn=10000+10; struct hh { int u,v,w,next; }e[maxn]; int n,m,x,head[maxn],dis[maxn]; bool vis[maxn]; void dij() { int k; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++)dis[i]=inf; dis[x]=0; for(int i=1;i<=n;i++) { k=-1; for(int j=1;j<=n;j++) if(!vis[j]&&(k==-1||dis[j]<dis[k]))k=j; vis[k]=true; for(int j=head[k];j!=-1;j=e[j].next) if(!vis[e[j].v]&&e[j].w+dis[k]<dis[e[j].v])dis[e[j].v]=e[j].w+dis[k]; } } int main() { scanf("%d %d %d",&n,&m,&x); for(int i=1;i<=m;i++) { scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); e[i].next=head[e[i].u]; head[e[i].u]=i; } dij(); for(int i=1;i<=n;i++) printf("%d",dis[i]); return 0; }