codevs 1041 Car的旅行路線 題解報告

噫,繼續我的刷題路。。。

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

那麼Car應如何安排到城市B的路線才能儘可能的節省花費呢?她發現這並不是一個簡單的問題,於是她來向你請教。
任務
找出一條從城市A到B的旅遊路線,出發和到達城市中的機場可以任意選取,要求總的花費最少。

輸入描述 Input Description
第一行爲一個正整數n(0<=n<=10),表示有n組測試數據。
每組的第一行有四個正整數s,t,A,B。
S(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個城市中任意三個機場的座標,T I爲第I個城市高速鐵路單位里程的價格。

輸出描述 Output Description
共有n行,每行一個數據對應測試數據。

樣例輸入 Sample Input
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

樣例輸出 Sample Output
47.5

數據範圍及提示 Data Size & Hint

這題,,哎呀,,一看就頭大,,,、
好氣啊
;;;
給出矩形的三個點,求第四個點的座標。
之後還要對每個城市建6條鐵路;
和總共 n^2 條航線。。

然後。跑 floyd
N<=100
floyd 水過。。。。

首先對於求第四個點左邊,
處理出三點之間兩兩之間距離
最長的爲斜邊
之後 X4 Y4 就是斜邊頂點座標加上另外兩點座標差了。

嗯,之後對於 4 個點 兩兩相連。

之後,,,,,,,連接航線。
嗯,跑floyd 、
嗯,
完了。
嗯。
代碼::

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<cstdlib>
#include<string>
#include<bitset>
#include<iomanip>
#include<deque>
#define INF 1000000000
#define fi first
#define se second
#define N 100005
#define P 1000000007
#define debug(x) cerr<<#x<<"="<<x<<endl
#define MP(x,y) make_pair(x,y)
using namespace std;
int n,m,p,h[1001],s,t,sf;
double x4,y4,x1,x2,x3,yy1,y2,y3;
double a[401][401];
inline double  get_num()
{
double  num = 0;
char c;
bool flag = false;
while ((c = getchar()) == ' ' || c == '\n' || c == '\r');
if (c == '-') flag = true;
else num = c - '0';
while (isdigit(c = getchar()))
num = num * 10 + c - '0';
return (flag ? -1 : 1) * num;
} // 忽略這一堆沒用的。。。。
struct re
{
    double  z[2][5];
}city[101];
struct zqm
{
    double  to,fr,next;
    double w;
}q[10001];
void add(int aa,int  b,int c)
{
    p++;
    q[p].to=b;
    q[p].fr=aa;
    q[p].w=c;
    q[p].next=h[aa];
    h[aa]=p;
}
double jl(double  a,double  b,double  c,double  d)
{
    double x=sqrt((b-a)*(b-a)+(d-c)*(d-c));

    return x;
}
void find()
{
    double l1,l2,l3;
    l1=jl(x1,x2,yy1,y2);
    l2=jl(x1,x3,yy1,y3);
    l3=jl(x2,x3,y2,y3);
    //cout<<endl<<l1<<" "<<l2<<" "<<l3<<" \n";

    if(l3>l1&&l3>l2)
    {
        x4=x2+(x3-x1);
        y4=y2+(y3-yy1);
    }
    if(l2>l1&&l2>l3)
    {
        x4=x1+x3-x2;
        y4=yy1+y3-y2;
    }
    if(l1>l2&&l1>l3)
    {
        x4=x1+x2-x3;
        y4=yy1+y2-y3;
    }
}

void build(int i,double k)
{
    i--;
    /*add(i*4+1,i*4+2,k*jl(x1,x2,for(int,y2));
    add(i*4+1,i*4+3,k*jl(x1,x3,yy1,y3));
    add(i*4+1,i*4+4,k*jl(x1,x4,yy1,y4));
    add(i*4+2,i*4+3,k*jl(x2,x3,y2,y3));
    add(i*4+2,i*4+4,k*jl(x4,x2,y4,y2));
    add(i*4+3,i*4+4,k*jl(x3,x4,y3,y4));
    add(i*4+2,i*4+1,k*jl(x1,x2,yy1,y2));
    add(i*4+3,i*4+1,k*jl(x1,x3,yy1,y3));
    add(i*4+4,i*4+1,k*jl(x1,x4,yy1,y4));
    add(i*4+3,i*4+2,k*jl(x2,x3,y2,y3));
    add(i*4+4,i*4+2,k*jl(x4,x2,y4,y2));
    add(i*4+4,i*4+3,k*jl(x3,x4,y3,y4));*/ //剛開始還傻傻的想打SPFA。。
    a[i*4+1][i*4+2]=k*jl(x1,x2,yy1,y2);
    a[i*4+1][i*4+3]=k*jl(x1,x3,yy1,y3);
    a[i*4+1][i*4+4]=k*jl(x1,x4,yy1,y4);
    a[i*4+2][i*4+3]=k*jl(x2,x3,y2,y3);
    a[i*4+2][i*4+4]=k*jl(x4,x2,y4,y2);
    a[i*4+3][i*4+4]=k*jl(x3,x4,y3,y4);
    a[i*4+2][i*4+1]=k*jl(x1,x2,yy1,y2);
    a[i*4+3][i*4+1]=k*jl(x1,x3,yy1,y3);
    a[i*4+4][i*4+1]=k*jl(x1,x4,yy1,y4);
    a[i*4+3][i*4+2]=k*jl(x2,x3,y2,y3);
    a[i*4+4][i*4+2]=k*jl(x4,x2,y4,y2);
    a[i*4+4][i*4+3]=k*jl(x3,x4,y3,y4);
}
void just_doit()
{
    for(int  i=1;i<=4*n;i++)
        {
            a[i][i]=0;
        }
    for(int  k=1;k<=n*4;k++)
    {
        for(int  i=1;i<=4*n;i++)
        {
            for(int  j=1;j<=4*n;j++)
            {
                if(a[i][j]>a[i][k]+a[k][j])
                {
                    a[i][j]=a[i][k]+a[k][j];
                }
            }
        }
    }
}
void mama()
{
    double mi= 2147483647;
    for(int  i=1;i<=4;i++)
    {
        for(int  j=1;j<=4;j++)
        {
            //cout<<a[(s-1)*4+i][(t-1)*4+j]<<endl;
            mi=min(a[(s-1)*4+i][(t-1)*4+j],mi);
        }
    }
    printf("%.1lf\n",mi);
}
int main()
{
    double  T;
    cin>>T;
    while(T--)
    {
        double  sh[101];
        cin>>n>>sf>>s>>t;
        memset(a,127,sizeof(a));

        for(int  i=1;i<=n;i++)
        {
            cin>>x1>>yy1>>x2>>y2>>x3>>y3>>sh[i];
            find();
            city[i].z[0][1]=x1;
            city[i].z[0][2]=x2;
            city[i].z[0][3]=x3;
            city[i].z[0][4]=x4;
            city[i].z[1][1]=yy1;
            city[i].z[1][2]=y2;
            city[i].z[1][3]=y3;
            city[i].z[1][4]=y4;
            build(i,sh[i]);
        }
        for(int  i=1;i<=n;i++)
        {
            for(int  j=1+i;j<=n;j++)
            {
                if(j==i)continue;
                for(int  k=1;k<=4;k++)
                {
                    int x=(i-1)*4+k;
                    for(int  l=1;l<=4;l++)
                    {
                        int y=(j-1)*4+l;
                        a[x][y]=sf*jl(city[i].z[0][k],city[j].z[0][l],city[i].z[1][k],city[j].z[1][l]);
                        a[y][x]=a[x][y];
                    }
                }
            }
        }
        just_doit();
        mama();
    } 

}

噫。
噫,
噫,,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章