演算法訓練 Car的旅行路線

2021-10-05 10:31:06 字數 3384 閱讀 7512

問題描述

又到暑假了,住在城市a的car想和朋友一起去城市b旅遊。她知道每個城市都有四個飛機場,分別位於乙個矩形的四個頂點上,同乙個城市中兩個機場之間有一 條筆直的高速鐵路,第i個城市中高速鐵路了的單位里程**為ti,任意兩個不同城市的機場之間均有航線,所有航線單位里程的**均為t。

那麼car應如何安排到城市b的路線才能盡可能的節省花費呢?她發現這並不是乙個簡單的問題,於是她來向你請教。

找出一條從城市a到b的旅遊路線,出發和到達城市中的機場可以任意選取,要求總的花費最少。

輸入格式

的第一行有四個正整數s,t,a,b。

s表示城市的個數,t表示飛機單位里程的**,a,b分別為城市a,b的序號,(1<=a,b<=s)。

接下來有s行,其中第i行均有7個正整數xi1,yi1,xi2,yi2,xi3,yi3,ti,這當中的(xi1,yi1),(xi2,yi2),(xi3,yi3)分別是第i個城市中任意三個機場的座標,t i為第i個城市高速鐵路單位里程的**。

輸出格式

共有n行,每行乙個資料對應測試資料,保留一位小數。

樣例輸入

11 10 1 3

1 1 1 3 3 1 30

2 5 7 4 5 2 1

8 6 8 8 11 6 3

樣例輸出

47.55

資料規模和約定

0思路:

只有三個點,運用幾何平行關係求出第四個點,用對角點x和y都不相同的思路求出對角點,即三個點中必然有乙個點和兩個點要麼x相同,要麼y相同,這個點就是對角點。

如果x1和x4是對角關係,那麼x1+x4=x2+x3,y1+y4=y2+y3(平行關係)

建立陣列,把所有點之間的權值儲存,w[i][j]表示i到j的權值,把起始城市的四個點分別當做起點,就變成單源最短路徑演算法,使用dijstra演算法求出最短路徑,最後比較4個起點最小路徑值。

#include

#include

#include

#include

using

namespace std;

const

double inf =

99999999

;struct node

;vectorcp(

1);int s, t, a, b;

double w[

500]

[500];

doubled(

int x1,

int y1,

int x2,

int y2)

boolp(

int x1,

int y1,

int x2,

int y2,

int x3,

int y3)

else

}double

dij(

int start)

//dijkstra迪傑斯特拉演算法,不斷迭代求每個點距起點的最短距離,存入dij陣列

;fill

(dij, dij +

500, inf)

; dij[start]=0

;for

(int i =

1; i <= s *

4; i++

)//遍歷所有的點}if

(x ==-1

)break

; book[x]=1

;for

(int j =

1; j <= s *

4; j++

)//更新最短路徑 }}

double ans = inf;

for(

int i =

1; i <=

4; i++

)return ans;

}int

main()

if(p(x2, y2, x1, y1, x3, y3))if

(p(x3, y3, x1, y1, x2, y2)

)//乙個城市各點間的權值

w[(i -1)

*4+1

][(i -1)

*4+2

]= w[

(i -1)

*4+2

][(i -1)

*4+1

]=d(x1, y1, x2, y2)

* t_;

w[(i -1)

*4+1

][(i -1)

*4+3

]= w[

(i -1)

*4+3

][(i -1)

*4+1

]=d(x1, y1, x3, y3)

* t_;

w[(i -1)

*4+1

][(i -1)

*4+4

]= w[

(i -1)

*4+4

][(i -1)

*4+1

]=d(x1, y1, x4, y4)

* t_;

w[(i -1)

*4+2

][(i -1)

*4+3

]= w[

(i -1)

*4+3

][(i -1)

*4+2

]=d(x2, y2, x3, y3)

* t_;

w[(i -1)

*4+2

][(i -1)

*4+4

]= w[

(i -1)

*4+4

][(i -1)

*4+2

]=d(x2, y2, x4, y4)

* t_;

w[(i -1)

*4+3

][(i -1)

*4+4

]= w[

(i -1)

*4+4

][(i -1)

*4+3

]=d(x3, x3, x4, y4)

* t_;

cp.push_back()

;//從cp[1]開始

cp.push_back()

; cp.

push_back()

; cp.

push_back()

;}for(

int i =

1; i <=

4* s; i++)}

}double ans = inf;

for(

int i =

1; i <=

4; i++

)//a城市為起點,把四個點分別作為起點,最後比較最小值

printf

("%.2f"

, ans)

;return0;

}

Car的旅行路線

題目描述 description 又到暑假了,住在城市a的car想和朋友一起去城市b旅遊。她知道每個城市都有四個飛機場,分別位於乙個矩形的四個頂點上,同乙個城市中兩個機場之間有一條筆直的高速鐵路,第i個城市中高速鐵路了的單位里程 為ti,任意兩個不同城市的機場之間均有航線,所有航線單位里程的 均為t...

Car的旅行路線

題d car的旅行路線 時間限制 1 記憶體限制 128 mb 提交 1 解決 0 標籤標籤已被遮蔽 提交狀態 討論版 題目描述 又到暑假了,住在城市a的car想和朋友一起去城市b旅遊。她知道每個城市都有四個飛機場,分別位於乙個矩形的四個頂點上,同乙個城市中兩個機場之間有一 條筆直的高速鐵路,第i個...

Car的旅行路線

又到暑假了,住在城市a的car想和朋友一起去城市b旅遊。她知道每個城市都有四個飛機場,分別位於乙個矩形的四個頂點上,同乙個城市中兩個機場之間有一條筆直的高速鐵路,第i個城市中高速鐵路了的單位里程 為ti,任意兩個不同城市的機場之間均有航線,所有航線單位里程的 均為t。那麼car應如何安排到城市b的路...