hdu 3790最短路徑問題

2022-05-01 18:33:08 字數 1406 閱讀 6855

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

(1output

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

sample input

3 21 2 5 6

2 3 4 5

1 30 0

sample output

9 11

思路:做這個題目首先一定要搞清楚一點————我們首先要求的還是最短的距離,其次再是最少的花費

我們可以把這個要求分成兩塊來完成,第一部分是求出一條最短路徑的花費,不用管這個花費是不是最少的,就是按照原來的模式求即可;第二部分,我們要做的就是詳細的考慮下這個題目的特殊要求,因為要求的是最短路徑,所以在原來的基礎上只有兩種可能性,比原來小的就繼續更新cost,和原來相等的也看看可不可以繼續更新cost

再就是輸入的資料的時候要注意一點:無論是dis還是cost,都要注意當前接受的是否是最小值

#include #include 

#include

#define maxn 1007

#define inf 65535

using

namespace

std;

intstart,e;

intn,m;

intmap[maxn][maxn];

intcost[maxn][maxn];

void

dijkstra()

memset(vis,

0,sizeof

(vis));

vis[start] = 1

;

for(int i = 1;i <= n;i++)

else

if(d[j] == d[v]+map[v][j])

if(c[j] > c[v]+cost[v][j])

c[j] = c[v]+cost[v][j];}}

printf(

"%d %d\n

",d[e],c[e]);

}int

main()

inta,b,c,d;

for(int i = 1;i <= m;i++)

else

if(map[a][b]==c)

}scanf(

"%d%d

",&start,&e);

dijkstra();

}return0;

}

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...