码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-08-08 13:46:44      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:struct   class   for   stack   inline   cst   应该   size   版本   

  洛谷和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 的旅行路线——又是傻逼和傻逼题纠缠的故事

标签:struct   class   for   stack   inline   cst   应该   size   版本   

原文地址:http://www.cnblogs.com/duskfire/p/7306111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!