C 最短路徑問題 HDU 3790

2021-08-23 12:33:28 字數 1186 閱讀 9494

給你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時輸入結束。 

(1output

輸出 一行有兩個數, 最短距離及其花費。

sample input

3 2

1 2 5 6

2 3 4 5

1 30 0

sample output

9 11
題意:

給你乙個無向圖,每條邊有長度和花費,在告訴你起點和終點,求出從起點到終點的最短路,  首先必須保證長度最短,如果長度最短的路徑有多條,輸出最短的花費那一條。

題解:在輸入資料時就要去重,首先判斷路得長度是否更小,相同時要判斷花費是否最小。

這樣在進行一遍dijkstra演算法,其中,更新最短路時和輸入的方法一樣,先判斷路得長度是否最短,最短則更新,相同時在判斷花費是否最小。在更新答案即可!

也就是要開兩個陣列,乙個是長度陣列d,另乙個是花費陣列co,  cost二維陣列記錄地圖!

#include#include#includeusing namespace std;

int maxn = 1010;

int inf = 1000010;

int g[1010][1010],d[1010];

int cost[1010][1010];

int co[1010];

int n,m,s;

bool v[1010];

void dijkstra(int s)

else if (d[y] == d[x] + g[x][y] && co[y] > co[x] + cost[x][y])}}

}int main()

else if (g[u][v] == w&&cost[u][v] < x)

}int s,e;

scanf("%d%d",&s,&e);

dijkstra(s);

printf("%d %d\n",d[e],co[e]);

}return 0;

}

hdu3790 最短路徑問題

wa了無數次,終於過了,還是dijkstra,只不過在距離,相同時,多判斷一下時間。注意重邊!include include include define m 0x7fffffff using namespace std struct p 2000 struct c 1020 1020 int vi...

HDU 3790 最短路徑問題

hdu 3790 最短路徑問題 單源最短路勁,更新路勁時要更新花費 include include include includeusing namespace std define inf 0x7fffffff int n,m int map 1005 1005 int cost 1005 100...

HDU 3790 最短路徑問題

include include include define nil 100000 struct node node 1001 初始化操作,把源點初始化為0,其他正無窮 param n 結點個數 param s 源點 int init shortpath source int n,int s nod...