1. 程式人生 > >最短路模板(dijkstra+鄰接表)

最短路模板(dijkstra+鄰接表)

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
#include<math.h>
#include<set>
#include<vector>
using namespace std;
#define maxn 550
#define MM 10000000
int V[maxn];
int d[maxn];
int fa[maxn];
int first[maxn],next[maxn],w[maxn],u[maxn],v[maxn];
int n,m;
void read_()
{                   //單向 or 雙向均可~
    scanf("%d%d",&n,&m);
    memset(first,-1,sizeof(first));
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&u[i],&v[i],&w[i]);
        next[i]=first[u[i]];
        first[u[i]]=i;
    }
   //雙向路徑
    for(int i=m+1;i<=2*m;i++)
    {
        u[i]=v[i-m];
        v[i]=u[i-m];
        w[i]=w[i-m];
        next[i]=first[u[i]];
        first[u[i]]=i;
    }

}
void Dijjkstra()
{
    memset(V,0,sizeof(V));
    memset(fa,0,sizeof(fa));
    for(int i=1;i<=n;i++)
        d[i]=(i==1?0:MM);
    for(int i=1;i<=n;i++)
    {
        int x,mm=MM;
        for(int j=1;j<=n;j++)
            if(d[j]<mm && !V[j])
            mm=d[x=j];
            V[x]=1;
          for(int e=first[x];e!=-1;e=next[e])
          {
              if(d[v[e]]>d[x]+w[e])
              {
                  d[v[e]]=d[x]+w[e];
                  fa[v[e]]=x;
              }

          }
    }
}
void dfs(int x ) //輸出路徑
{
    cout<<x<<endl;
    if(fa[x]==0)
        return;
    else
  {
        dfs(fa[x]);
        if(x==n)
      cout<<fa[x];
      else
      cout<<fa[x]<<' ';
  }
}
int main()
{
    read_();
    Dijjkstra();
    dfs(n);     //輸出路徑:可更改終點值。
    cout<<' '<<n<<endl;
   return 0;
}
其他的模板會陸續上傳~