Dijkstra 單源最短路(二)
阿新 • • 發佈:2018-11-19
#include <iostream> #include<iomanip> #include<cstring> using namespace std; const int MAX =1000; const int INF =0x3f3f3f; int m,n; int lowdis[MAX]; int lowval[MAX]; int cost[MAX][MAX]; int vis[MAX]; int map[MAX][MAX]; void dijkstra(int st){ int temp=0; for(int i=1;i<=n;i++) { lowdis[i]=map[st][i]; lowdis[st]=0; lowval[i]=cost[st][i]; lowval[st]=0; } vis[st]=true; for(int i=1;i<n;i++){ int MIN=INF; for(int j=1;j<=n;j++){ if(!vis[j]&&lowdis[j]<MIN){ temp=j; MIN=lowdis[j]; } } vis[temp]=true; for(int j=1;j<=n;j++){ if(map[temp][j]<INF&&!vis[j]){ if(lowdis[j]>lowdis[temp]+map[temp][j]){ lowdis[j]=lowdis[temp]+map[temp][j]; lowval[j]=lowval[temp]+cost[temp][j]; } else if(lowdis[j]==lowdis[temp]+map[temp][j]) if(lowval[j]>lowval[temp]+cost[temp][j]) lowval[j]=lowval[temp]+cost[temp][j]; } } } } int main() { for(int i=0;i<MAX;i++) for(int j=0;j<MAX;j++){ cost[i][j]=INF; map[i][j]=INF; } memset(vis, false, sizeof vis); while(cin>>n>>m&&m&&n){ for(int i=0;i<m;i++) { int x,y; cin>>x>>y; int val,dis; cin>>dis; map[x][y]=map[y][x]=dis; cin>>val; cost[x][y]=cost[y][x]=val; } int start,end; cin>>start>>end; dijkstra(start); for(int i=1;i<=n;i++){ cout<<setw(5)<<"到達第"<<i<<" 個點的距離為"; cout<<setw(5)<<lowdis[i]<<" 價值為 "<<lowval[i]<<endl; } } }
沒啥好說的,在最短路的基礎上加了求最小花費,當兩路徑距離相同時判斷花費!