Dijkstra算法(帶路徑模板)
阿新 • • 發佈:2017-11-25
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 #definenu 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算法(帶路徑模板)