Car的旅行路线

思路:

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

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

来,上代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 807
#define maxm 860005
#define INF 0x7fffffff struct CityType {
double x[],y[],c;
};
struct CityType city[maxn]; int T,n,s,t,head[maxn],E[maxm],V[maxm];
int cnt,que[maxn<<]; 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=,tail=;que[]=s*-,que[]=s*-;
que[]=s*-,que[]=s*,if_[s*-]=true;
if_[s*-]=true,if_[s*-]=true,if_[s*]=true;
dis[s*-]=,dis[s*-]=,dis[s*-]=,dis[s*]=;
while(h<tail)
{
int now=que[h++];if_[now]=false;
for(int i=head[now];i;i=E[i])
{
if(dis[V[i]]>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,,sizeof(head)),cnt=;
scanf("%d%lf%d%d",&n,&c,&s,&t);
for(int i=;i<=n;i++)
{
for(int v=;v<;v++) scanf("%lf%lf",&city[i].x[v],&city[i].y[v]);
scanf("%lf",&city[i].c);
double d01=d(i,,),d02=d(i,,),d12=d(i,,);
int pos=i*-;
if(d01+d02==d12)
{
city[i].x[]=city[i].x[]+city[i].x[]-city[i].x[];
city[i].y[]=city[i].y[]+city[i].y[]-city[i].y[];
}
else if(d01+d12==d02)
{
city[i].x[]=city[i].x[]+city[i].x[]-city[i].x[];
city[i].y[]=city[i].y[]+city[i].y[]-city[i].y[];
}
else
{
city[i].x[]=city[i].x[]+city[i].x[]-city[i].x[];
city[i].y[]=city[i].y[]+city[i].y[]-city[i].y[];
}
for(int j=;j<=;j++)
{
for(int v=j+;v<=;v++) edge_add(pos+j,pos+v,sqrt(d(i,j,v))*city[i].c);
}
}
for(int i=;i<=n;i++)
{
for(int j=i+;j<=n;j++)
{
int posi=i*-,posj=j*-;
for(int v=;v<;v++)
{
for(int z=;z<;z++) edge_add(v+posi,z+posj,ds(i,v,j,z)*c);
}
}
}
spfa();double ans=INF;
for(int i=;i<=;i++) ans=min(ans,dis[i+t*-]);
printf("%.1lf",ans);
}
return ;
}

最新文章

  1. iOS 简单的分段下载文件
  2. TCP/IP协议握手过程详解
  3. 蓝牙的SDP协议总结
  4. cdev简单解析
  5. DBHelper (支持事务与数据库变更) z
  6. 【JMeter】JMeter完成一个java请求的压测
  7. 编写可维护的javascript代码--- 2015.11.21(基本格式化)
  8. JAVA_build_ant_cmd pass muti param
  9. hdu 3488 Tour
  10. FZU 1894 志愿者选拔 单调队列
  11. selenium python自动化测试 ddt数据驱动
  12. 常用的flex布局
  13. 在CentOs7上部署Gunicorn
  14. css实现礼券效果3
  15. java8的Streams
  16. 团队作业第五周(HCL盐酸队)
  17. PyCharm+Scrapy爬取安居客楼盘信息
  18. 编程使用缓冲流读取试题文件,test6_5.txt 内容如下所示。 每次显示试题文件中的一道题目,读取到字符“*”时暂停读取, 等待用户从键盘输入答案。用户做完全部题目后,程序给出用户的得分。
  19. cocos2d-js 3.0 rc2 自定义UI控件组件 例子:能播放动画的MenuItem。MenuItemSprite的bug
  20. 为什么Python类成员的调用和声明必须有&quot;this&quot;?

热门文章

  1. SoapUI(一)之webservice测试
  2. Contest - 中南大学第六届大学生程序设计竞赛(Semilive)
  3. oracle 11g 版本自带移除,省时省力
  4. dp专练
  5. Helloworld 在jvm 内存图
  6. Apache Compress-使用
  7. ADO之密码验证--3次错误就锁定
  8. 堆STL和重载运算符
  9. 用最优方法从LinkedList列表中删除重复元素
  10. 【bzoj4012】[HNOI2015]开店 动态点分治+STL-vector