1. 程式人生 > >Dijkstra算法(帶路徑模板)

Dijkstra算法(帶路徑模板)

oid iostream 貪心思想 更新 else end col using 短路徑

個人心得:Dijkstra算法是貪心思想的一種延伸,註意路徑pre,pre數組表示此時最短路徑中的前一個頂點。每次更新到目的點時更新;

從源點出發,更新路徑,然後找出此時最短的點,然後以這個點為頭,看能否縮減路程,

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<algorithm>
using namespace std;
#define inf 1<<29
#define
nu 10005 #define maxnum 100000 int n,m; int c[nu][nu]; int dist[nu]; int pre[nu]; int book[nu]; void dijkstra(int n,int v){ int i,j; memset(book,0,sizeof(book)); for(i=1;i<=n;i++){ dist[i]=c[v][i]; if(dist[i]>maxnum) pre[i]=0; else pre[i]=v; } dist[v]=0; book[v]=1; for(i=1;i<n;i++){
int temp=maxnum; int u=v; for(j=1;j<=n;j++){ if(!book[j]&&dist[j]<temp) u=j,temp=dist[j]; } book[u]=1; for(j=1;j<=n;j++){ if(!book[j]&&c[u][j]<maxnum) { if(dist[j]>dist[u]+c[u][j]){ dist[j]
=dist[u]+c[u][j]; pre[j]=u; } } } } for(int i=1;i<=n;i++) cout<<dist[i]<<endl; } void traceback(int v,int i,int pre[]) { cout<<i<<" <--"; i=pre[i]; if(i!=v) traceback(v,i,pre); if(i==v) cout<<i<<endl; } int main() { cin>>n>>m; for(int i=0;i<nu;i++) for(int j=0;j<nu;j++) if(i!=j) c[i][j]=c[j][i]=maxnum; else c[i][j]=0; for(int i=1;i<=m;i++){ int x,y,z; cin>>x>>y>>z; c[x][y]=c[y][x]=z; } dijkstra(n,2); traceback(2,4,pre); return 0; }

Dijkstra算法(帶路徑模板)