Car 的旅行路线——又是傻逼和傻逼题纠缠的故事

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Car 的旅行路线——又是傻逼和傻逼题纠缠的故事相关的知识,希望对你有一定的参考价值。

  洛谷和CodeVS 版本应该是一样的,有多组数据并且要求保留一位小数。Vijos 的版本没有多组数据,要保留两位小数。胡搅蛮缠换了两次最短路算法,终于还是做出来了。

技术分享
 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<vector>
 7 #include<cstdio>
 8 #include<stack>
 9 #include<queue>
10 #include<cmath>
11 #include<map>
12 #include<set>
13 using namespace std;
14 const int N=512,M=0x3f3f3f3f;
15 const double DIF=1e4;
16 struct node{
17     int x,y,cost;
18 }ap[N];
19 int n,air,sx,tx,apn,res=M,dis[N];
20 inline int dist(int x,int y){
21     return (int)(sqrt((double)((ap[x].x-ap[y].x)*(ap[x].x-ap[y].x)+(ap[x].y-ap[y].y)*(ap[x].y-ap[y].y)))*DIF);
22 }
23 int main(){
24     int T;cin>>T;
25     while(T--){
26         res=M;
27         memset(dis,0x3f,sizeof dis);
28         memset(ap,0,sizeof ap);
29         
30         cin>>n>>air>>sx>>tx;sx--;tx--;
31         
32         for(int i=1;i<=n;i++){
33             int t;
34             cin>>ap[apn].x>>ap[apn].y;apn++;
35             cin>>ap[apn].x>>ap[apn].y;apn++;
36             cin>>ap[apn].x>>ap[apn].y;apn++;
37             cin>>t;
38             ap[apn-3].cost=ap[apn-2].cost=ap[apn-1].cost=ap[apn].cost=t;
39             if((ap[apn-1].x-ap[apn-2].x)*(ap[apn-1].x-ap[apn-3].x)+(ap[apn-1].y-ap[apn-2].y)*(ap[apn-1].y-ap[apn-3].y)==0)
40                 ap[apn].x=0-ap[apn-1].x+ap[apn-2].x+ap[apn-3].x,ap[apn].y=0-ap[apn-1].y+ap[apn-2].y+ap[apn-3].y,apn++;
41             else if((ap[apn-3].x-ap[apn-1].x)*(ap[apn-3].x-ap[apn-2].x)+(ap[apn-3].y-ap[apn-1].y)*(ap[apn-3].y-ap[apn-2].y)==0)
42                 ap[apn].x=ap[apn-1].x+ap[apn-2].x-ap[apn-3].x,ap[apn].y=ap[apn-1].y+ap[apn-2].y-ap[apn-3].y,apn++;
43             else
44                 ap[apn].x=ap[apn-1].x-ap[apn-2].x+ap[apn-3].x,ap[apn].y=ap[apn-1].y-ap[apn-2].y+ap[apn-3].y,apn++;
45         }
46         
47         for(int i=0;i<apn;i++)
48             if(i/4!=sx)
49                 for(int j=0;j<4;j++)
50                     dis[i]=min(dis[i],dist(i,sx*4+j))*air;
51         for(int i=0;i<4;i++)dis[sx*4+i]=0;
52         
53         queue<int> q;
54         for(int i=0;i<4;i++)q.push(sx*4+i);
55         
56         while(!q.empty()){
57             int x=q.front();q.pop();
58             for(int i=0;i<apn;i++)
59                     if(i/4==x/4){
60                         if(dis[i]>dis[x]+dist(x,i)*ap[i].cost){
61                             q.push(i);
62                             dis[i]=dis[x]+dist(x,i)*ap[i].cost;
63                         }
64                     }
65                     else
66                         if(dis[i]>dis[x]+dist(x,i)*air){
67                             q.push(i);
68                             dis[i]=dis[x]+dist(x,i)*air;
69                         }
70         }
71         
72         for(int i=0;i<4;i++)res=min(res,dis[tx*4+i]);
73         printf("%.2lf",(double)res/DIF);
74     }
75     return 0;
76 }
Method_01

  洛谷 0ms CodeVS 5ms

以上是关于Car 的旅行路线——又是傻逼和傻逼题纠缠的故事的主要内容,如果未能解决你的问题,请参考以下文章

[bzoj4644]经典傻逼题

一个傻逼题

bzoj4644: 经典傻逼题

P1016 旅行家的预算

LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线

最短路luoguP1027Car的旅行路线