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;
}
原文地址:https://www.cnblogs.com/new-hand/p/7491922.html