1. 程式人生 > >【圖論】Car的旅行線路 NOIP 2001

【圖論】Car的旅行線路 NOIP 2001

【NOIP2001】Car的旅行線路

題目描述

又到暑假了,住在城市A的Car想和朋友一起去城市B旅遊。 她知道每個城市都有四個飛機場,分別位於一個矩形的四個頂點上,同一個城市中兩個機場之間有一條筆直的高速鐵路,第I個城市中高速鐵路了的單位里程價格為Ti,任意兩個不同城市的機場之間均有航線,所有航線單位里程的價格均為t。 那麼Car應如何安排到城市B的路線才能儘可能的節省花費呢?她發現這並不是一個簡單的問題,於是她來向你請教。 任務: 找出一條從城市A到B的旅遊路線,出發和到達城市中的機場可以任意選取,要求總的花費最少。

輸入

第一行為一個正整數n(1≤n≤10),表示有n組測試資料。

每組的第一行有四個正整數s,t,A,B。 S(0<S≤100)表示城市的個數,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個城市中任意三個機場的座標,TI為第I個城市高速鐵路單位里程的價格。

輸出

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

樣例輸入

1
3 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

最開始,讓我燒腦的就是怎麼求第4個機場的座標。後來發現,在一個平面直角座標系的矩形中,一個頂點的座標就是兩個相鄰點的座標之和減去對點的座標。舉一個例子:

A(1,2),B(2,4),C(3,1),那麼D點就是(B的座標+C的座標-A的座標):

XD=2+3-1=4;YD=4+1-2=3;∴D(4,3)。

可是要這樣的話我們必須還要判斷3個點中哪兩個點是第4個點的相鄰點。我們先在剛才那個矩形中不看D點,然後把A,B,C連成一個Rt△,發現A點就是直角頂點,而我們在剛才計算過程中所減去的對角就是A,所以得出一個結論:

三個點中的直角頂點就是需要減去的那個對點。

所以再初始化每個機場之間的距離,用兩點間距離公式——

A(x1,y1),B(x2,y2)之間AB=√(x1-x2)²+(y1-y2)²

然後再把每個距離來乘飛機的單價或高速鐵路的單價。這裡要注意一個判斷兩機場是否在同一城市時。不能用

if(i/4==j/4) dis[i][j]*=lufei[i/4];

因為比如i為3、j為4時,i/4≠j/4。所以要用

if((i-1)/4==(j-1)/4) dis[i][j]*=lufei[(i-1)/4+1];

這樣就不會判斷錯誤了。

最後再用Floyed(隨便,根據自己喜好)來搜就行了。

程式碼如下:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
using namespace std;
int t,s,p,A,B,x,xx,xxx,y,yy,yyy,xd,yd,m,n,xxxx[401],yyyy[401],lu[101];
double dis[401][401];
void Z(int xa ,int xb ,int xc ,int ya ,int yb ,int yc)
{
    double ab=(xa-xb)*(xa-xb)+(ya-yb)*(ya-yb);
    double ac=(xa-xc)*(xa-xc)+(ya-yc)*(ya-yc);
    double bc=(xb-xc)*(xb-xc)+(yb-yc)*(yb-yc);
    if(ab+ac==bc)//bc為斜邊,A為對角
    {
        xd=xb+xc-xa;
        yd=yb+yc-ya;
        return ;
    }
         
    if(ab+bc==ac)//ac為斜邊,B為對角
    {
        xd=xa+xc-xb;
        yd=ya+yc-yb;
        return ;
    }
     
    if(ac+bc==ab)//ab為斜邊,C為對角
    {
        xd=xa+xb-xc;
        yd=ya+yb-yc;
        return ;
    }
     
}
 
void Dis()
{
    for(int i=n+1;i<=n+4;i++) dis[i][i]=0;//先更新同一個城市的距離
    dis[n+1][n+2]=dis[n+2][n+1]=sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy));
    dis[n+1][n+3]=dis[n+3][n+1]=sqrt((x-xxx)*(x-xxx)+(y-yyy)*(y-yyy));
    dis[n+1][n+4]=dis[n+4][n+1]=sqrt((x-xd)*(x-xd)+(y-yd)*(y-yd));
    dis[n+2][n+3]=dis[n+3][n+2]=sqrt((xx-xxx)*(xx-xxx)+(yy-yyy)*(yy-yyy));
    dis[n+2][n+4]=dis[n+4][n+2]=sqrt((xx-xd)*(xx-xd)+(yy-yd)*(yy-yd));
    dis[n+3][n+4]=dis[n+4][n+3]=sqrt((xxx-xd)*(xxx-xd)+(yyy-yd)*(yyy-yd));
}
 
void Y()
{
    for(int u=1;u<=s*4;u++)
    {
        for(int v=1;v<=s*4;v++)
        {
            if((u-1)/4==(v-1)/4)//同一個城市
                dis[u][v]*=lu[(u-1)/4+1];
            else//不同城市
            {
                dis[u][v]=sqrt((xxxx[u]-xxxx[v])*(xxxx[u]-xxxx[v])+(yyyy[u]-yyyy[v])*(yyyy[u]-yyyy[v]))*p;
            }
        }
    }
}
 
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        memset(dis,0x7f,sizeof(dis));
        memset(xxxx,0,sizeof(xxxx));
        memset(yyyy,0,sizeof(yyyy));
        memset(lu,0,sizeof(lu));    
        n=0;
        scanf("%d%d%d%d",&s,&p,&A,&B);
        if(A==B){printf("0.00\n");continue;}
        for(int ll=1;ll<=s;ll++)
        {
            scanf("%d %d %d %d %d %d %d",&x,&y,&xx,&yy,&xxx,&yyy,&m);lu[ll]=m;
            Z(x,xx,xxx,y,yy,yyy);
            Dis();
            xxxx[++n]=x;yyyy[n]=y;//存點座標
            xxxx[++n]=xx;yyyy[n]=yy;
            xxxx[++n]=xxx;yyyy[n]=yyy;
            xxxx[++n]=xd;yyyy[n]=yd;
        }
        Y();
        for(int k=1;k<=s*4;k++)//Floyed
            for(int i=1;i<=s*4;i++)
                for(int j=1;j<=s*4;j++)
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
        double k=1<<30;
        for(int i=1;i<=4;i++)//兩個城市的每個機場到每個機場的距離找最小的
            for(int j=1;j<=4;j++)
                k=min(k,dis[(A-1)*4+i][(B-1)*4+j]);
        printf("%.2lf\n",k);
    }   
}

相關推薦

Car旅行線路 NOIP 2001

【NOIP2001】Car的旅行線路 題目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅遊。 她知道每個城市都有四個飛機場,分別位於一個矩形的四個頂點上,同一個城市中兩個機場之間有一條筆直的高速鐵路,第I個城市中高速鐵路了的單位里程價格為Ti,任意兩個不同

AtCoderARC061Eすぬけ君の地下鉄旅行 / Snuke's Subway Trip

すぬけ君の地下鉄旅行 / Snuke’s Subway Trip 題目大意 原題傳送門 大意 給定N(2≤N≤105)N(2≤N≤105)個城市及M(0≤M≤2×105)M(0≤M≤2×105)條地鐵線路,第ii條線路連線pipi,

NOIP模擬題2016.11.18 第二題 心 題解

第二題:心(heart.cpp/c/pas) 背景描述: 不是一切深淵都是滅亡 不是一切滅亡都覆蓋在弱者的頭上 ——《這也是一切》 舒婷 有N個透明的盒子, 每個盒子裡面有兩個不同顏色的球,

網絡流總結

hdu 3338 -m ini post 平衡 題目 esp urn data- 【圖論】網絡流總結 最大流部分 網絡流題目的關鍵:看出是網絡流而且確定正確的模型 最大流算法:用來解決從源點s到匯點t,整個網絡最多能輸送多少流量的題目 模

最優貿易

價格 highlight style 不同 相同 -s 存在 n) size [NOIP2009]最優貿易 描述   C 國有 n 個大城市和 m 條道路,每條道路連接這 n 個城市中的某兩個城市。任意兩個城市之間最多只有一條道路直接相連。這 m 條道路中有一部分為單向

Self-Assembly(6-19)

inline const 分析 i++ 不能 hash unbound tac 正方形 [UVA1572]Self-Assembly 算法入門經典第6章6-19(P172) 題目大意:有一些正方形,每條邊上都有A-~Z- A+~Z+的編號,或者00,A+的邊可以拼A-,

tarjan

AS code 更新 out 聯通 ace 起點 是什麽 環路 剛接觸tarjan,tarjan其實更多是用來找強聯通分量。我這裏呢,是看qsc的視頻學的。卿學姐講的其實很清楚啦。 我這裏只是做個整理。 low[]:表示能到達這個點的最小編號。[樹枝邊]。啊,其實

割點

百度百科 sum 所有 baidu tdi ++ define show .com 百度百科 Definition&Solution   在一個無向聯通圖中,如果刪除一個點,該圖變得不連通,那麽該點稱作該圖的割點。註意,割點可能不止一個。   對於無向不連通圖

8月19日前填坑指南(自用)

自用 排列 歐拉回路 深度優先 獨立 perf 最小 前向星 最短路 Graph 圖論 前向星 圖的割點、橋 雙連通分量 有向圖的強連通分量 無向圖連通分支 拓撲排序 2-SAT 最短路 第K短路 哈密頓路、歐拉路徑、歐拉回路 DAG的深度優先搜索標記 獨立集、團、支配集

2018國慶三校聯考D5T2

分析: 題意非常醜陋。。。簡化出來就一句話:每個點有選中、未選中兩種狀態,現在給出一些矛盾關係,要求加入儘可能少的矛盾關係,使得沒有合法方案。 如此2sat的模型,顯然需要2sat的連邊方式。。。然後直接列舉每個位置選、不選是否合法即可。若不選合法,則考慮其練的邊是否有一個

[JZOJ5899]NOIP2018模擬10.6資源運輸矩陣樹定理

Description 給定一個n個點,m條邊的帶權無向圖。 定義這個圖的一個生成樹的權值為生成樹上邊權的乘積。 求所有生成樹權值的平均值,答案對998244353取模。 2<=n<=300,n-1<=m<=1000 Solution 平均值=和/總數

codefroces 1037 E Trips逆向思維度大於等於k的最大子

【連結】 【題意】 有n個人,一開始都不是朋友,m天每天都會有x,y成為朋友,現在他們有trip,只有他們出去玩的朋友數大於等於k才能出去,求每天出去最多的人數。朋友關係不具有傳遞性 【思路】 用set維護圖,並記錄與點相連的邊集。如果圖從無到有建邊,那麼每加入一

思維題AGC004F Namori

分析: 比較複雜的一道思維題。。。 先考慮樹的情況,把所有點按照深度的奇偶性分為兩類,在所有深度為奇的點放一個“+1”,在所有深度為偶的點放一個“-1”。這樣一來,每次染色,就可以看作交換了一對相鄰的“+1”和“-1”。目標狀態就是所有的“+1”移動到“-1”所

數學DPAGC009E Eternal Average

分析: 首先要轉換為一棵K度樹,有N個權為0的葉子節點,有M個權位1的葉子結點。每個非葉子節點的權值為其所有兒子的權值的平均值。 那麼設1的點的深度分別為a1,a2,a3……ama_1,a_2,a_3…

AGC010C Cleaning

分析: 以任意一個葉子結點為根,然後對每個點,考慮其會向上貢獻多少條路徑,順便統計是否合法。詳見程式碼 #include<cstdio> #include<cstring> #i

DFSB Hamiltonish Path

分析: 很簡單的DFS水題。 很容易發現,這個起點和終點的條件是很容易構造的,我們只需要隨便從一個點出發,向其中某個方向一直dfs下去,直到走不動了,那個點設為起點。再從另一個方向一直dfs下去,直到走

淺析尤拉路

尤拉路介紹 首先大家可以嘗試去看一下專業的解釋。 維基百科(英文) 當然看不懂也沒什麼所謂,本文字身就是想要去簡單地解析尤拉路。 歐拉回路簡單的來說,就是在一張圖G中,如果能夠能夠找到一條路徑,滿足在遍歷路徑的過程中,G中的每條邊都被遍歷過1次。這樣的路

DFS三校聯考10.20T2

題意 尋找有多少條邊滿足:圖中所有奇環都包含這條邊,且這條邊不屬於任何偶環 分析: 最後一個性質好坑。。。一直在想那個性質結果T3都沒來得及做… 直接建一個DFS樹。因為是無向圖,所以只存在樹邊和返祖

拉普拉斯矩陣(Laplacian matrix)

拉普拉斯矩陣是圖論中用到的一種重要矩陣,給定一個有n個頂點的圖 G=(V,E),其拉普拉斯矩陣被定義為 L = D-A,D其中為圖的度矩陣,A為圖的鄰接矩陣。例如,給定一個簡單的圖: 把此“圖”轉換為鄰接矩陣的形式,記為A: 把W的每一列元素加起來得到N個數,然後

每日演算法最小邊覆蓋 & 最小路徑覆蓋 & 最小頂點覆蓋 & 最大獨立集 & 最大團

最小邊覆蓋 = 最大獨立集 = |V| - 最大匹配數 這個是在原圖是二分圖上進行的 最小路徑覆蓋和最小邊覆蓋不同,不要求給的圖是二分圖,而是要求是N x N的有向圖,不能有環,然後根據原圖構造二分圖,構造方法是將點一分為二,如,i分為i1和i2然後如果i和j有邊,那麼就在i