HDU 3790 最短路徑問題

2022-05-18 14:42:09 字數 1452 閱讀 6979

題目描述:求圖上乙個點到另乙個點的最短距離 以及最小花費。

解題報告:這題用迪傑斯特拉演算法是沒有疑問,但是重點就是花費最小的問題,這個只要再開乙個陣列單獨存放花費就可以了,其他的跟最短路徑是一樣的,但是這題我交了n次,就是 因為在輸入的處理上,感覺這題也有點坑,題目上並沒有說兩個點之間可能有多條路徑,但事實卻是存在兩個點之間有多條路徑的可能,弄得我wa到死,後來看了別人的報告才發現,問題就出在我在取重複的路徑的最小值的問題上,取最小值的時候千萬不能簡單的將路徑跟花費分開求最小值,還要考慮到路徑跟花費是有關係的,要更新必須經過特殊的處理,即先判斷兩點之間的長度是否大於後來輸入的長度,如果是,則將這兩點之間的長度和花費無條件更換,如果後來輸入的長度跟原來的長度相等,那麼在兩條路徑之間取花費較小的就可以了。**附上:

1 #include2 #include3 #include4

const

int max = 1000+5,inf = 1061109568;5

int map[max][max][2

],visit[max],t[max],cost[max],n,m;67

intmain()

19else

if(d==map[a][b][0

])20 map[a][b][1] = map[b][a][1] = std::min(map[a][b][1

],p);21}

22 scanf("

%d%d

",&s,&e);

23 t[s] = cost[s] = 0; //

將起點的花費和路徑長度都賦0

24 t[0] = inf-1; //

為便於更新s的值,將t[0]賦無窮大

25 memset(visit,0,sizeof

(visit));

26while(1

) 33

else

if(t[s]+map[s][i][0]==t[i])

34 cost[i] = std::min(cost[i],cost[s] + map[s][i][1

]);35

}36 visit[s] = 1

;37 s = 0; //

將s做初始化處理

38bool flag = 1;39

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

40if(!visit[i]&&t[i]

44if(flag) //

設定退出條件

45break;46

}47 printf("

%d %d\n

",t[e],cost[e]);48}

49return0;

50 }

view code

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