HDU 2066 乙個人的旅行 多源到多源最短路

2022-08-02 06:45:14 字數 1865 閱讀 8492

思路:兩種方法,一種是直接多次dijk演算法,但要注意把各個初始節點之間的距離設為0,否則會runtimeerror。另一種比較巧妙,設乙個0節點(草兒家),更新0節點到初始節點距離為0,就轉化為單源到多源問題了,乙個dijk就ok。

法一:

1

//各個初始節點之間距離為0

2 #include3 #include4 #include5

#define inf 0x3f3f3f3f

6#define n 1005

7using

namespace

std;

8int

t,s,d,n;

9int

g[n][n],dis[n],mark[n];

10int

s[n],e[n];

1112

void

getmap()

2223

for(int i=0;i)

24 scanf("

%d",&s[i]);

25for(int i=0;i)

26 scanf("

%d",&e[i]);

2728

for(int i=0;i//

把初始點之間的距離更新為0

29for(int j=i+1;j)

30 g[s[i]][s[j]]=g[s[j]][s[i]]=0

;

3132}33

34void dijk(int

s)46 mark[p]=1;47

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

51} 52}

5354

intmain()

63}

64 printf("

%d\n

",ans);

65}

66return0;

67 }

法二:

1

//設家節點

2 #include3 #include4 #include5

#define inf 0x3f3f3f3f

6#define n 1005

7using

namespace

std;

8int

t,s,d,n;

9int

g[n][n],dis[n],mark[n];

10int

s[n],e[n];

1112

void

getmap()

21for(int i=0;i<=n;i++)

22 g[i][i]=0;23

24for(int i=0;i)

25 scanf("

%d",&s[i]);

26for(int i=0;i)

27 scanf("

%d",&e[i]);

2829

for(int i=0;i//

把家與各初始點間距離設為0

30 g[0][s[i]]=g[s[i]][0]=0

; 31}

3233

void

dijk()

45 mark[p]=1;46

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

50} 51}

5253

intmain()

62return0;

63 }

hdu 2066 乙個人的旅行 (多源最短路 )

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

hdu 2066 乙個人的旅行

我覺得這題應該用floyd演算法會更好一點吧,猜的,還沒學,囧.我是用dijstra暴力水過.嗯開始學floyd code include include include include include include include include include include include ...

Hdu 2066 乙個人的旅行

最短路問題 dijkstra 分析 1 本題的起始點和終點不唯一。假設有一點起始點離全部的相鄰城市的距離都是1,有一點終點離全部的想要去的目的地的距離也都是1,則將dijkstra出來的值減2即可。2 兩個城市之間的路不唯一,可有多條路,所以在輸入的時候做一下判斷,選取最小的。ac include ...