博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AC日记——Car的旅行路线 洛谷 P1027
阅读量:7186 次
发布时间:2019-06-29

本文共 2407 字,大约阅读时间需要 8 分钟。

 

 

思路:

  这题不难,就是有点恶心;

  而且,请认真读题目(就是题目卡死劳资);

 

来,上代码:

#include 
#include
#include
#include
#include
using namespace std;#define maxn 807#define maxm 860005#define INF 0x7fffffffstruct CityType { double x[4],y[4],c;};struct CityType city[maxn];int T,n,s,t,head[maxn],E[maxm],V[maxm];int cnt,que[maxn<<2];double W[maxm],dis[maxn],c;bool if_[maxn];inline double d(int now,int v1,int v2){ double x1=city[now].x[v1],x2=city[now].x[v2]; double y1=city[now].y[v1],y2=city[now].y[v2]; return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);}inline void edge_add(int u,int v,double w){ E[++cnt]=head[u],V[cnt]=v,W[cnt]=w,head[u]=cnt; E[++cnt]=head[v],V[cnt]=u,W[cnt]=w,head[v]=cnt;}double ds(int u,int v1,int v,int v2){ double xx=city[u].x[v1]-city[v].x[v2]; double yy=city[u].y[v1]-city[v].y[v2]; return sqrt(xx*xx+yy*yy);}void spfa(){ memset(if_,false,sizeof(if_)); memset(dis,0x7f,sizeof(dis)); int h=0,tail=4;que[0]=s*4-3,que[1]=s*4-2; que[2]=s*4-1,que[3]=s*4,if_[s*4-3]=true; if_[s*4-2]=true,if_[s*4-1]=true,if_[s*4]=true; dis[s*4-3]=0,dis[s*4-2]=0,dis[s*4-1]=0,dis[s*4]=0; while(h
dis[now]+W[i]) { dis[V[i]]=dis[now]+W[i]; if(!if_[V[i]]) if_[V[i]]=true,que[tail++]=V[i]; } } }}int main(){ scanf("%d",&T); while(T--) { memset(head,0,sizeof(head)),cnt=0; scanf("%d%lf%d%d",&n,&c,&s,&t); for(int i=1;i<=n;i++) { for(int v=0;v<3;v++) scanf("%lf%lf",&city[i].x[v],&city[i].y[v]); scanf("%lf",&city[i].c); double d01=d(i,0,1),d02=d(i,0,2),d12=d(i,1,2); int pos=i*4-3; if(d01+d02==d12) { city[i].x[3]=city[i].x[1]+city[i].x[2]-city[i].x[0]; city[i].y[3]=city[i].y[1]+city[i].y[2]-city[i].y[0]; } else if(d01+d12==d02) { city[i].x[3]=city[i].x[0]+city[i].x[2]-city[i].x[1]; city[i].y[3]=city[i].y[0]+city[i].y[2]-city[i].y[1]; } else { city[i].x[3]=city[i].x[0]+city[i].x[1]-city[i].x[2]; city[i].y[3]=city[i].y[0]+city[i].y[1]-city[i].y[2]; } for(int j=0;j<=3;j++) { for(int v=j+1;v<=3;v++) edge_add(pos+j,pos+v,sqrt(d(i,j,v))*city[i].c); } } for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { int posi=i*4-3,posj=j*4-3; for(int v=0;v<4;v++) { for(int z=0;z<4;z++) edge_add(v+posi,z+posj,ds(i,v,j,z)*c); } } } spfa();double ans=INF; for(int i=0;i<=3;i++) ans=min(ans,dis[i+t*4-3]); printf("%.1lf",ans); } return 0;}

 

转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6758511.html

你可能感兴趣的文章
【转】Crontab定时任务配置
查看>>
虚拟机克隆
查看>>
java学习之路--面试之并发基础
查看>>
Bat命令学习
查看>>
Asp.net 无法访问请求的页面,因为该页的相关配置数据无效。
查看>>
莫比乌斯反演题目泛做(为了对应smz的课件)
查看>>
Kworkerd恶意挖矿分析
查看>>
10 款高质量的 jQuery 表单验证插件
查看>>
H3C-实验一
查看>>
[导入]xmlhttp通信心得
查看>>
legend2---开发日志8(thinkphp和vue如何配合才能达到最优)
查看>>
js进阶 9-14 js如何实现下拉列表多选移除
查看>>
css3-5 css3鼠标、列表和尺寸样式怎么用(文字有关的样式会被继承)
查看>>
html5--5-14 阶段小练习:绘制太极图案
查看>>
7-74 JavaScript 事件
查看>>
day1 作业编写登录窗口
查看>>
Linux下Vim的使用
查看>>
Swing-JFileChooser的使用
查看>>
Ajax Step By Step4
查看>>
NodeJs之文件合并(某一文件的内容发生变化与之相关的内容重新合并)
查看>>