題目描述:給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。
輸入:輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t;起點s,終點t。n和m為0時輸入結束。
(1輸出:輸出 一行有兩個數, 最短距離及其花費。
樣例輸入:
3 21 2 5 6
2 3 4 5
1 30 0
樣例輸出:
9 11
這些用dijkstra解決的圖論問題還是很常見的。這道題在常規題的基礎上加上了每條路的花費。但在本質上絲毫不影響最短路的演算法思想。
其實只要在每次更新dis[j]的時候,也更新一次s[j],它表示從起點到j點的花費最小值,特別要注意的是,當dis[j]和dis[k]+map[k][j]相等的時候,不更新dis[j],但要更新s[j],因為相等的距離,題目要求花費的最小值,所以這種情況要注意一下。
另外,陣列不要開太小,像我第一次開到1000,邊界值沒注意到,就沒過。還有給定的max應該大一些。
#include #include #define max 1<<29
using namespace std;
int map[1010][1010];
int cost[1010][1010];
bool visit[1010];
int dis[1010]; //表示從起點到各點的距離
int s[1010]; //表示從起點到各點的花費
int n,m;
void dijkstra(int start,int end)
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
}visit[k] = 1;
for(int j=1;j<=n;j++)
else if(!visit[j] && dis[j] == (dis[k]+map[k][j]))}}
cout<>n>>m)
int a,b,d,p;
for(int i=0;i>a>>b>>d>>p;
map[a][b] = map[b][a] = d;
cost[a][b] = cost[b][a] = p;
}int start,end;
cin>>start>>end;
dijkstra(start,end);
}return 0;
}
最短路徑問題 九度 OJ 1008
在該題中不僅需要求得起點到終點的最短距離,還需要在有多條最短路徑的時,選取花費最少的那一條。要解決這個問題,只要更改 dijstra 演算法中關於 更近 的評判標準即可 有兩條路徑,若它們距離不一樣時,距離小的更近 若距離一樣時花費少的更近。當定義這種新的評判標準後,dijstra 演算法照樣能求得...
九度OJ 1008最短路徑問題
題目1008 最短路徑問題時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 3219 解決 963 題目描述 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入 輸入n,m,點的編號是1 ...
OJ 1008 最短路徑問題
include using namespace std const int n 1001 const int inf 100000000 typedef struct map map ma n n map temp n void init int n void dijkstra int s,int ...