CODEVS 1041Car的旅行路線

2021-07-24 11:13:38 字數 2575 閱讀 4253

。我在此**的基礎上做進一步的說明解釋。

#include 

#include

#include

#include

#include

using

namespace

std;

const

double oo = 10000000;

//城市的飛機場 (x-1)*4+1代表第x個城市開始的飛機場下標

#define ctoa(x) (((x-1)<<2)+1)

//距離

#define distance(x1,y1,x2,y2) ((double)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)))

//此題我用floyd做的,因為資料太弱,過了

//每個飛機場為乙個節點,答案就是a到b所有的路線最短路的最小值

struct city

ct[105];

double node[4050][4050];

double t;

int s, t, a, b, n, i, j, k, l, temp, airport, tx[3], ty[3];

//至於計算第四個點,由數學知識我們可以知道,相互垂直的兩條直線的斜率互為負倒數,所以我們只要每次計算ab、bc的斜率。

//如果不滿足條件,那麼將a、b、c的座標分別賦值為b、c、a,這樣不斷迭代,直到ab、bc垂直,這樣就能計算出第四個點的座標。

//還要注意乙個問題,如果ab或者bc與座標軸垂直,需要單獨討論這種情況,因為被除數不能為零。

//(1) 首先判斷直角的位置:

//因為從測試資料檔案中讀入的三個點的座標是無序的,因此需判斷直角的位置,然後在計算第四個點的座標。

//對於線段l1、l2,如果(x1-x2)*(x3-x2)+(y1-y2)*(y3-y2)=0,那麼l1 ⊥ l2。

//(2) 計算(x4,y4):

//由x4-x3=x1-x2得x4=x1-x2+x3,同樣的y4=y1-y2+y3

void getfour(int c) //獲取第四個城市

ct[c].x[3] = tx[0]-tx[1]+tx[2];

ct[c].y[3] = ty[0]-ty[1]+ty[2];}

int main()

//s<<2表示飛機場數量,即s*4

airport = s << 2;

for(i = 1; i <= airport; i++)

for(j = 1; j <= airport; j++)

node[i][j] = oo; //初始化

for(i = 1; i <= s; i++)

//初始不同城市飛機場的花費

for(i = 1; i <= s; i++)

for(j = 1; j <= s; j++)

if(i != j)

for(k = 0; k < 4; k++)

for(l = 0; l < 4; l++)

node[ctoa(i)+k][ctoa(j)+l] = (distance(ct[i].x[k], ct[i].y[k], ct[j].x[l], ct[j].y[l]) * t);

//floyd

for(k = 1; k <= airport; k++)

for(i = 1; i <= airport; i++)

for(j = 1; j <= airport; j++)

node[i][j] = min(node[i][j], node[i][k]+node[k][j]);

//a到b所有的路線最短路的最小值

double ans = oo;

for(i = 0; i < 4; i++)

for(j = 0; j < 4; j++)

ans = min(ans, node[ctoa(a)+i][ctoa(b)+j]);

printf("%.1lf",ans);

}return

0;}

題解:本題我一開始並未使用陣列來儲存每個城市的機場座標。如下:

struct nodecity[110];//不要這麼做!!!
導致後面的程式冗長、複雜,然後。。。我就不想寫了。。。所以我copy了iwtwiioi_2 的**,在這裡表示感謝!

注意:一定要使用陣列來儲存機場的座標!就像iwtwiioi_2 這樣:

struct cityct[105];//應該這樣做!!!
對於第四個點的求解,除了源**的注釋上的方法外還可以從向量的方面理解。首先也要討論哪個點是直角點,而直角點無非是(x1,y1),(x2,y2),(x3,y3)中的乙個,所以討論三次。根據向量的點積的定義,假設有三個點a(x1,y1),b(x2,y2),c(x3,y3),若ab⊥bc,則b為直角點,座標間關係滿足(點乘): ( x1-x2 , y1-y2 ) • ( x3-x2 , y3-y2 ) =0 => (x1-x2) * (x3-x2) + (y1-y2) * (y3-y2)=0 。由此(x4,y4)點的座標也可以輕鬆給出:x4=x1+x3-2 * x2 , y4=y1+y3-2 * y2。

codevs 1041 Car的旅行路線

傳送門 思路 這個題目預處理起來比較麻煩,由於題目中說了乙個城市有四個機場,但是指給定三個,所以需要我們自己去求第四個點,這個過程就需要列舉哪乙個點為直角頂點然後再求第四個。求出第四個點後在預處理出任意兩個機場之間的花費 注意區分同乙個城市和不同城市 然後再跑dij即可.求第四個點只需列舉一下哪個點...

wikioi 1041 Car的旅行路線

建圖是關鍵機場通過鐵路,城市有4個機場可以到達,可以出發 告訴3個點有多個情況 1,2為對角,1,3為對角,2,3為對角 include include include include includeusing namespace std double map 110 5 110 5 i的k1到j的...

Car的旅行路線

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