首页 > 代码库 > Car 的旅行路线——又是傻逼和傻逼题纠缠的故事
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 else44 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 else66 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 }
洛谷 0ms CodeVS 5ms
Car 的旅行路线——又是傻逼和傻逼题纠缠的故事
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。