2583. 南极科考旅行

★★   输入文件:BitonicTour.in   输出文件:BitonicTour.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

小美要在南极进行科考,现在她要规划一下科考的路线。

地图上有 N 个地点,小美要从这 N 个地点中 x 坐标最小的地点 A,走到 x 坐标最大的地点 B,然后再走回地点 A。

请设计路线,使得小美可以考察所有的地点,并且在从 A 到 B 的路程中,考察的地点的 x 坐标总是上升的,在从 B 到 A 的过程中,考察的地点的 x 坐标总是下降的。

求小美所需要走的最短距离(欧几里得距离)。

【输入格式】

输入共 N+1 行。

第 1 行包含 1 个正整数 N,表示地图上共有 N 个地点。

第 1 +(1) 至 1 +(N) 行,每行包含 2 个正整数 x, y,表示其中 1 个地点的坐标。

【输出格式】

输出共 1 行。

第 1 行包含一个浮点数,表示小美需要走的最短距离,保留两位小数。

【样例输入】

4
1 1
2 3
4 1
3 2

【样例输出】

 8.06

【数据范围及约定】

对于前 20% 测试数据

3 <= N <= 6

1 <= x <= 20, 1 <= y <= 20

对于后 80% 测试数据

3 <= N <= 300

1 <= x <= 10000, 1 <= y <= 10000

对于全部测试点,保证每个点坐标的 x 值互不相同

【来源】

Bitonic Tour

题解

乍一看好像一脸 $DP$ 的样子...这种要走一个来回的情形似乎是之前的某个叫做小烈上菜的题...

然而居然出现在了网络流专题里...

行吧网络流就网络流...一开始感觉不会有费用流就开始构最大流(最小割)的图然而直接 $GG$ ...然后意识到是费用流...

woc我不会打费用流啊QAQ

$dbw$ 强行教学一波 $zkw$ 网络流...打完板子开始构图w

首先肯定是要按横坐标排序, 然后我们发现一去一回的方向并没有什么卵用, 找到一个环和找到两条路径是等价的. 这样我们可以发现, 每个结点都必须选择两条边, 其中 $x$ 最小的结点两条都是出边, 最大的结点两条都是入边, 其他结点一条入边一条出边, 这样的话我们可以得到这样的构图:

其中较粗的边容量为2, 较细的边容量为1, $s$ 连出的边和连向 $t$ 的边费用为 $0$ , 实际结点间边的距离即为欧几里得距离.

写 $zkw$ 网络流的话有一个坑点: 由于增广时要判断某条边是否在最短路上, 但是现在费用是一个实数, 所以会有精度问题, 直接使用  dis[s]+i->dis==dis[i->to]  判定的话会炸精度死循环, 这点需要注意OwO

参考代码

GitHub

 #include <bits/stdc++.h>

 const int MAXV=1e3+;
const int MAXE=2e5+;
const double INF=1e10;
const int INFI=0x3F3F3F3F;
const double EPSILON=1e-; struct Edge{
int from;
int to;
int flow;
double dis;
Edge* rev;
Edge* next;
};
Edge E[MAXE];
Edge* head[MAXV];
Edge* top=E; struct Node{
double x;
double y;
bool friend operator<(const Node& a,const Node& b){
return a.x<b.x;
}
};
Node N[MAXV]; int n;
int v;
bool vis[MAXV];
double dis[MAXV]; double Sqr(double);
bool SPFA(int,int);
int DFS(int,int,int);
double Dinic(int,int);
void Insert(int,int,double,int);
double EucDis(const Node&,const Node&); int main(){
#ifndef ASC_LOCAL
freopen("BitonicTour.in","r",stdin);
freopen("BitonicTour.out","w",stdout);
#endif
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lf%lf",&N[i].x,&N[i].y);
}
std::sort(N+,N++n);
for(int i=;i<n;i++){
Insert(,i<<,,);
Insert(i<<|,,,);
}
Insert(,<<,,);
Insert(n<<|,,,);
v=n*+;
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
Insert(i<<,j<<|,EucDis(N[i],N[j]),);
}
}
printf("%.2f\n",Dinic(,));
return ;
} double Dinic(int s,int t){
double ans=;
while(SPFA(s,t)){
memset(vis,,sizeof(vis));
ans+=DFS(s,INFI,t)*dis[t];
}
return ans;
} int DFS(int s,int flow,int t){
if(s==t||flow==)
return flow;
int tmp=flow;
int k;
vis[s]=true;
for(Edge* i=head[s];i!=NULL&&tmp>;i=i->next){
if(i->flow>&&fabs(dis[i->from]+i->dis-dis[i->to])<EPSILON&&!vis[i->to]){
k=DFS(i->to,std::min(tmp,i->flow),t);
tmp-=k;
i->flow-=k;
i->rev->flow+=k;
}
}
return flow-tmp;
} bool SPFA(int s,int t){
for(int i=;i<v;i++)
dis[i]=INF;
memset(vis,,sizeof(vis));
std::queue<int> q;
q.push(s);
vis[s]=true;
dis[s]=;
while(!q.empty()){
s=q.front();
vis[s]=false;
q.pop();
for(Edge* i=head[s];i!=NULL;i=i->next){
if(i->flow>&&dis[s]+i->dis<dis[i->to]){
dis[i->to]=dis[s]+i->dis;
if(!vis[i->to]){
q.push(i->to);
vis[i->to]=true;
}
}
}
}
return dis[t]<INFI;
} void Insert(int from,int to,double dis,int flow){
top->from=from;
top->to=to;
top->dis=dis;
top->flow=flow;
top->rev=top+;
top->next=head[from];
head[from]=top++; top->from=to;
top->to=from;
top->dis=-dis;
top->flow=;
top->rev=top-;
top->next=head[to];
head[to]=top++;
} inline double EucDis(const Node& a,const Node& b){
return sqrt(Sqr(a.x-b.x)+Sqr(a.y-b.y));
} inline double Sqr(double x){
return x*x;
}

Backup

[COGS 2583]南极科考旅行的更多相关文章

  1. Cogs 1264. [NOIP2012] 开车旅行(70分 暴力)

    1264. [NOIP2012] 开车旅行 ★★☆   输入文件:drive.in   输出文件:drive.out   简单对比时间限制:2 s   内存限制:128 MB [题目描述] 小A 和小 ...

  2. COGS 2. 旅行计划

    2. 旅行计划 ★☆   输入文件:djs.in   输出文件:djs.out   简单对比时间限制:3 s   内存限制:128 MB 过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距 ...

  3. cogs 2. 旅行计划 dijkstra+打印路径小技巧

    2. 旅行计划 ★★   输入文件:djs.in   输出文件:djs.out   简单对比时间限制:3 s   内存限制:128 MB [题目描述] 过暑假了,阿杜准备出行旅游,他已经查到了某些城市 ...

  4. cogs 186. [USACO Oct08] 牧场旅行 树链剖分 LCA

    186. [USACO Oct08] 牧场旅行 ★★☆   输入文件:pwalk.in   输出文件:pwalk.out   逐字节对比时间限制:1 s   内存限制:128 MB n个被自然地编号为 ...

  5. 186. [USACO Oct08] 牧场旅行

    186. [USACO Oct08] 牧场旅行(点击转到COGS) 输入文件:pwalk.in   输出文件:pwalk.out 时间限制:1 s   内存限制:128 MB 描述 n个被自然地编号为 ...

  6. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  7. vijos P1780 【NOIP2012】 开车旅行

    描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...

  8. 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流

    1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 388  Solved: 212[Submit ...

  9. codevs 1036 商务旅行(Targin求LCA)

    传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...

随机推荐

  1. Errors running buider 'DeploymentBuilder' on project 'HFMS'

    1.错误描述 2.错误原因 HFMS项目不是利用MyEclipse创建的,但是用MyEclipse打开的 3.解决办法 (1)关闭MyEclipse,找到HFMS项目,删除"com.genu ...

  2. Filter组件开发中的SDK基类分析

    DirectShow SDK提供了一套开发Filter的基类源代码.基于这些基类开发Filter将大大简化开发过程. 1.CBaseObject 大部分SDK类都从CBaseObject类(参见com ...

  3. AJAX跨域问题总结

    跨域是什么? 首先说下同源,同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同.而跨域就是不同源 ! 能够进行跨域的请求 一般a,img,link[rel=stylesheet], ...

  4. Unity3d开发中与oc交互之类型转换

    对于非科班出身的程序来说,在没有学过C和OC的情况,用unity开发iOS相关的功能,是非常痛苦的.简单写一下自己遇到的,并且没有百度到的坑. 1.C#给OC传递字典 一般流程是,C#调用C,C调用O ...

  5. [mysql] 2进制安装和简单优化

    ##################################mysql 2进制安装和简单优化################################################## ...

  6. 由js深拷贝引起的对内存空间的一些思考

    数据类型 js常用数据类型分为基本类型和引用类型 基本类型:null.undefined.数值型.字符串型.布尔型 引用类型:数组.对象 内存空间 var a = [1, 2, 3]; var b = ...

  7. springboot集成Actuator

    Actuator监控端点,主要用来监控与管理. 原生端点主要分为三大类:应用配置类.度量指标类.操作控制类. 应用配置类:获取应用程序中加载的配置.环境变量.自动化配置报告等与SpringBoot应用 ...

  8. RobotFramework下的http接口自动化Set Request Body 关键字的使用

    Set Request Body关键字用来设置http 请求时的body 信息,尤其是在post 请求时,经常需要用到这个关键字. 该关键字接收一个参数,[ body ] 示例1:登录博客园(http ...

  9. 【BZOJ4566】找相同字符(后缀数组)

    [BZOJ4566]找相同字符(后缀数组) 题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求\(SA,height\) 那么,考虑一下暴力 在两个串各枚举一 ...

  10. vultr VPS的购买及搭建ss介绍,支持锐速加速优化

    Vultr虽然成立时间不久,但是其背景实力还是比较雄厚的,基于全球最大的游戏服务器提供商之一的基础,所以才有实力开设这么多的数据中心.有速度较好的日本东京.洛杉矶等机房,也有我们很多人需要的欧洲机房等 ...