洛谷 P1027 Car的旅行路线

来源:互联网 发布:大数据信息化调研提纲 编辑:程序博客网 时间:2024/05/16 23:42

题目描述
又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。
这里写图片描述
图例(从上而下)
机场 高速铁路 飞机航线
注意:图中并没有标出所有的铁路与航线。
那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。
找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。
输入输出格式
输入格式:

第一行为一个正整数n(0<=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个城市中任意三个机场的坐标,T I为第I个城市高速铁路单位里程的价格。

输出格式:

共有n行,每行一个数据对应测试数据。 保留一位小数

输入输出样例
输入样例#1:
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
输出样例#1:
47.5


建图很麻烦,如何求第四个顶点的坐标。
可以根据向量垂直,暴力判断出直角顶点,之后横或纵(4)=横或纵(锐角1)+横或纵(锐角2)-横或纵(直角)。
最后暴力跑spfa()。


#include<iostream>#include<cstdio>#include<queue>#include<cmath>using namespace std;int T,n,v,s,e,t[105],a[105][5][2];double ans,dis[105][5];bool b[105][5];struct airp{    int x,y;}tmp;queue<airp>q;int pd(int u){    if((a[u][2][0]-a[u][1][0])*(a[u][3][0]-a[u][1][0])+(a[u][2][1]-a[u][1][1])*(a[u][3][1]-a[u][1][1])==0)        return 1;    if((a[u][1][0]-a[u][2][0])*(a[u][3][0]-a[u][2][0])+(a[u][1][1]-a[u][2][1])*(a[u][3][1]-a[u][2][1])==0)        return 2;    if((a[u][2][0]-a[u][3][0])*(a[u][1][0]-a[u][3][0])+(a[u][2][1]-a[u][3][1])*(a[u][1][1]-a[u][3][1])==0)        return 3;}double dist(int x1,int y1,int x2,int y2){    return sqrt((a[x1][y1][0]-a[x2][y2][0])*(a[x1][y1][0]-a[x2][y2][0])+(a[x1][y1][1]-a[x2][y2][1])*(a[x1][y1][1]-a[x2][y2][1]));}void spfa(){    for(int i=1;i<=n;i++)        for(int j=1;j<=4;j++)            dis[i][j]=1e9+7;    for(int i=1;i<=4;i++)    {        dis[s][i]=0;        tmp.x=s,tmp.y=i;        q.push(tmp);        b[s][i]=1;    }    while(!q.empty())    {        airp u=q.front();        for(int i=1;i<=n;i++)            if(i!=u.x)                for(int j=1;j<=4;j++)                    if(dis[i][j]>dis[u.x][u.y]+v*dist(u.x,u.y,i,j))                    {                        dis[i][j]=dis[u.x][u.y]+v*dist(u.x,u.y,i,j);                        if(!b[i][j])                        {                            b[i][j]=1;                            tmp.x=i,tmp.y=j;                            q.push(tmp);                        }                    }        for(int i=1;i<=4;i++)            if(i!=u.y)                if(dis[u.x][i]>dis[u.x][u.y]+t[u.x]*dist(u.x,u.y,u.x,i))                {                    dis[u.x][i]=dis[u.x][u.y]+t[u.x]*dist(u.x,u.y,u.x,i);                    if(!b[u.x][i])                    {                        b[u.x][i]=1;                        tmp.x=u.x,tmp.y=i;                        q.push(tmp);                    }                }        q.pop();        b[u.x][u.y]=0;    }}int main(){    scanf("%d",&T);    while(T--)    {        scanf("%d%d%d%d",&n,&v,&s,&e);        for(int i=1;i<=n;i++)        {            scanf("%d%d%d%d%d%d%d",&a[i][1][0],&a[i][1][1],&a[i][2][0],&a[i][2][1],&a[i][3][0],&a[i][3][1],&t[i]);            int zhi=pd(i),rui1,rui2;            for(int j=1;j<=3;j++)                if(j!=zhi)                    rui1=j;            for(int j=1;j<=3;j++)                if(j!=zhi&&j!=rui1)                    rui2=j;            a[i][4][0]=a[i][rui1][0]+a[i][rui2][0]-a[i][zhi][0],a[i][4][1]=a[i][rui1][1]+a[i][rui2][1]-a[i][zhi][1];        }        spfa();        ans=1e9+7;        for(int i=1;i<=4;i++)            ans=min(ans,dis[e][i]);        printf("%.1f\n",ans);    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝直播间没人怎么办 花呗地区限制怎么办 支付宝花呗账单错误怎么办 台球厅生意惨淡怎么办 退货少了东西怎么办 微店注册id怎么办 卖红酒没有客源怎么办 来姨妈10天没走怎么办 京东违反广告法怎么办 支付宝定位错误怎么办 银行账户未年审怎么办 淘宝集运禁运品 怎么办 物流显示禁运品怎么办 淘宝禁运品怎么办呢 货物退回日本了怎么办 淘宝卖家寄多了衣服怎么办 集运地址选错怎么办 淘宝卖韩国化妆品退货怎么办 去韩国留学手机怎么办 韩国办无线网怎么办 淘宝卖家被骗怎么办 淘宝买软件被骗怎么办 被淘宝店诈骗怎么办? 支付宝被骗2000怎么办 给私人打款后不发货怎么办 毕业证寄丢了怎么办 微商下单返现被骗一千四怎么办 淘宝买东西卡里多扣钱怎么办 付款了卖家不发货怎么办 淘宝客服不解决问题怎么办 淘宝未付款订单怎么办 淘宝被限制购买怎么办 苹果官换机维修过怎么办 iphone x官换机坏了怎么办 小娃不要大人睡怎么办? 深度睡眠太少怎么办 踏板摩托车淹缸怎么办 电喷摩托车淹缸怎么办 踏板摩托不过油怎么办 火花塞被汽油淹怎么办 踏板车淹缸了怎么办