題目:
problem description
給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。
input
輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t;起點s,終點。n和m為0時輸入結束。(1
output
輸出 一行有兩個數, 最短距離及其花費。
sample input
3 21 2 5 6
2 3 4 5
1 30 0
sample output
9 11
#includeusing namespace std;
#define finity 0x7fffffff
int d[1002][1002]; //長度
int p[1002][1002]; //花費
bool b[1002]; //標記是否已加入
int n,m;
int pv0[1002];
int dv0[1002];
void dijkstra(int v0)
}if(mind == finity)
return;
b[k] = true;
//由於k的加入 更新d[v0]
for(int i = 0;imind + d[k][i])
else if(dv0[i] == mind + d[k][i] && pv0[i] >minp + p[k][i])}}
}}int main()
{ int s,t;
while((cin>>n>>m) && (n||m))
{//初始化
for(int i = 0;i>ta>>tb>>td>>tp; //這裡用cin會超時,大量資料應用scanf輸入
scanf("%d%d%d%d",&ta,&tb,&td,&tp);
ta = ta -1;
tb = tb -1;
if(td>s>>t;
dijkstra(s-1);
cout<
Dijkstra 單源最短路徑
演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...
Dijkstra 單源最短路徑
演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...
Dijkstra單源最短路徑
dijkstra單源最短路徑 給定乙個帶權有向圖g v,e 其中每條邊的權是乙個非負實數。另外,還給定 v 中的乙個頂點,稱為源。現在我們要計算從源到所有其他各頂點的最短路徑長度。這裡的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。下面給出兩個計算單源最短路徑的模板。dijkstra 簡...