演算法 最短路徑 Hdu2066 乙個人的旅行

2021-08-19 03:00:06 字數 2010 閱讀 8574

problem description

input

輸入資料有多組,每組的第一行是三個整數t,s和d,表示有t條路,和草兒家相鄰的城市的有s個,草兒想去的地方有d個;

接著有t行,每行有三個整數a,b,time,表示a,b城市之間的車程是time小時;(1=<(a,b)<=1000;a,b 之間可能有多條路)

接著的第t+1行有s個數,表示和草兒家相連的城市;

接著的第t+2行有d個數,表示草兒想去地方。

output

輸出草兒能去某個喜歡的城市的最短時間。

sample input

6 2 3

1 3 5

1 4 7

2 8 12

3 8 4

4 9 12

9 10 2

1 28 9 10

sample output

9

題目分析:

這是乙個求最短路徑的問題,是多源多結點型,在用dijkstra時採用雙重for迴圈,結果tle。後考慮到每乙個源結點的dijkstra()可以搜尋所有的目的結點,遂將第二重for迴圈放到dijkstra()中,結果ac。

此題有乙個地方需注意,(1=<(a,b)<=1000;a,b 之間可能有多條路),此句要注意a,b之間取最小路,去重問題。

**:

// hdu 2066 乙個人的旅行

// 迪傑斯特拉--最短路徑問題

// 從源頂點到達各個頂點,的 最短距離

#include#include#include#include//memset

#include// max

#define int_max 0x7fffffff

#define alone -1;

using namespace std;

/*function: dijkstra(int v,int n,vector&dist,vector&pre,vector> &d)

param: int v:開始節點

int n: 節點數

dist : 距離

pre : 父輩節點

d : 圖

return: void

注意:1.下標從0還是從1開始? 決定了n/ s(n)/s(n+1)

2.孤立節點怎麼處理

*/int dijkstra(int v,int n,int* dist,int* pre,vector> d,int d,int *b )

else pre[i]=alone; //未找到父輩

} dist[v]=0; //開始節點的距離 置0

s[v]=true; //開始節點 染黑

for(int i=2;i<=n;i++) // n-1 次迴圈}}

} for(int i=0;idist[b[i]]) result=dist[b[i]];

} return result;

}int main()

} int p,q,value; // p->q

int max_point=0;

for(int i=0;i>p>>q>>value;

if(max_point <= max(p,q))

max_point=max(p,q);

if(value< d[p][q] )

}int n=max_point;

int a[n],b[n];

for(int i=0;i>a[i];

} for(int i=0;i>b[i]; }

int min_dist=int_max;

for(int i=0;i

HDU 2066 最短路徑問題

誰知道這個題目我弄了好久,有點不按套路出牌 真的是乙個人的旅行aaaa problem description 輸入資料有多組,每組的第一行是三個整數t,s和d,表示有t條路,和草兒家相鄰的城市的有s個,草兒想去的地方有d個 接著有t行,每行有三個整數a,b,time,表示a,b城市之間的車程是ti...

HDU 2066 一 個人的旅行 最短路)

乙個人的旅行 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice hdu 2066 description input 輸入資料有多組,每組的第一行是三個整數t,s和d,表示有t條...

最短路 HDU2066 乙個人的旅行

description input 輸入資料有多組,每組的第一行是三個整數t,s和d,表示有t條路,和草兒家相鄰的城市的有s個,草兒想去的地方有d個 接著有t行,每行有三個整數a,b,time,表示a,b城市之間的車程是time小時 1 接著的第t 1行有s個數,表示和草兒家相連的城市 接著的第t ...