hdu 4606 简单计算几何+floyd+最小路径覆盖
思路:将所有的直线的两个端点和城市混在一起,将能直接到达的两个点连线,求一次floyd最短路径。二分枚举bag容量,然后按给的要先后占领的城市由前向后,把能到一步到达的建一条边。然后求一次最小路径覆盖,就是最少需要多少个士兵才能全部占领,跟给出的p值进行比较。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define Maxn 510
#define Maxm Maxn*Maxn
#define eps 1e-6
#define inf 100000000
using namespace std;
int match[Maxn],vi[Maxn],graphic[Maxn][Maxn],n,m,p,list[Maxn];
double dis[Maxn][Maxn];
struct Point{
double x,y;
}city[Maxn*];
struct Edge{
Point a,b;
}edge[Maxn];
void init()
{
int i,j;
memset(vi,,sizeof(vi));
memset(match,-,sizeof(match));
memset(graphic,,sizeof(graphic));
for(i=;i<=;i++)
for(j=;j<=;j++)
dis[i][j]=inf;
}
double multi(Point p0, Point p1, Point p2)//j计算差乘
{ return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}
double Dis(Point &a,Point &b)
{ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
bool is_cross(Point s1,Point e1,Point s2,Point e2)//判断线段是否相交(非规范相交)
{
return
multi(s1,e1,s2)*multi(s1,e1,e2) < -eps &&
multi(s2,e2,s1)*multi(s2,e2,e1) < -eps;
}
int dfs(int u)
{
int i,j;
for(i=;i<=n;i++)
{
if(!vi[i]&&graphic[u][i])
{
vi[i]=;
if(match[i]==-||dfs(match[i]))
{
match[i]=u;
return ;
}
}
}
return ;
}
int maxmatch()
{
int i,j;
int ans=;
memset(match,-,sizeof(match));
for(i=;i<=n;i++)
{
memset(vi,,sizeof(vi));
if(dfs(i))
ans++;
}
return n-ans;
}
int main()
{
int t,i,j,e,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&p);
init();
for(i=;i<=n;i++)
scanf("%lf %lf",&city[i].x,&city[i].y);
e=n;
for(i=;i<=m;i++)
{
scanf("%lf%lf%lf%lf",&edge[i].a.x,&edge[i].a.y,&edge[i].b.x,&edge[i].b.y);
city[++e].x=edge[i].a.x,city[e].y=edge[i].a.y;city[++e].x=edge[i].b.x,city[e].y=edge[i].b.y;
}
for(i=;i<=n;i++)
scanf("%d",list+i);
int flag=;
for(i=;i<e;i++)//将能直线到达的点建边
{
for(j=i+;j<=e;j++)
{
flag=;
for(k=;k<=m;k++)
{
if(is_cross(city[i],city[j],edge[k].a,edge[k].b))
{
flag=;
break;
}
}
if(!flag)
dis[i][j]=dis[j][i]=Dis(city[i],city[j]);
}
}
double Max=;
for(k=;k<=e;k++)//求所有点的最短路径
for(i=;i<=e;i++)
for(j=;j<=e;j++)
{
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
for(i=;i<=n;i++)
for(j=;j<=n;j++)
if(dis[i][j]!=inf)
Max=max(Max,dis[i][j]);
double l,r,mid;
l=,r=Max;
int temp;
while(r-l>eps)//二分枚举bag容量
{
mid=(l+r)/;
memset(graphic,,sizeof(graphic));
for(i=;i<n;i++)
for(j=i+;j<=n;j++)
{
if(dis[list[i]][list[j]]<=mid)
{
graphic[list[i]][list[j]]=;
}
}
temp=maxmatch();
if(temp>p)
l=mid;
else
r=mid;
}
printf("%.2lf\n",r);
}
return ;
}
hdu 4606 简单计算几何+floyd+最小路径覆盖的更多相关文章
- HDU 6311 Cover (无向图最小路径覆盖)
HDU 6311 Cover (无向图最小路径覆盖) Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- HDU 4606 Occupy Cities ★(线段相交+二分+Floyd+最小路径覆盖)
题意 有n个城市,m个边界线,p名士兵.现在士兵要按一定顺序攻占城市,但从一个城市到另一个城市的过程中不能穿过边界线.士兵有一个容量为K的背包装粮食,士兵到达一个城市可以选择攻占城市或者只是路过,如果 ...
- hdu 1151 Air Raid(二分图最小路径覆盖)
http://acm.hdu.edu.cn/showproblem.php?pid=1151 Air Raid Time Limit: 1000MS Memory Limit: 10000K To ...
- HDU 1151 Air Raid(最小路径覆盖)
题目大意: 有n个城市,m条道路,城市的道路是单向. 现在我们的伞兵要降落在城市里,然后我门的伞兵要搜索所有道路.问我们最少占领多少个城市就可以搜索所有的道路了. 我们可以沿着道路向前走到达另一个城 ...
- POJ 2594 Treasure Exploration (Floyd+最小路径覆盖)
<题目链接> 题目大意: 机器人探索宝藏,有N个点,M条边.问你要几个机器人才能遍历所有的点. 解题分析: 刚开始还以为是最小路径覆盖的模板题,但是后面才知道,本题允许一个点经过多次,这与 ...
- Treasure Exploration---poj2594(传递闭包Floyd+最小路径覆盖)
题目链接:http://poj.org/problem?id=2594 在外星上有n个点需要机器人去探险,有m条单向路径.问至少需要几个机器人才能遍历完所有的点,一个点可以被多个机器人经过(这就是和单 ...
- POJ2594:Treasure Exploration(Floyd + 最小路径覆盖)
Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 9794 Accepted: 3 ...
- POJ-2594 Treasure Exploration,floyd+最小路径覆盖!
Treasure Exploration 复见此题,时隔久远,已忘,悲矣! 题意:用最少的机器人沿单向边走完( ...
- HDU - 1151 Air Raid (最小路径覆盖)
题意:给定一个有向无环图,求最少划分几条路径,使之能够覆盖所有点. 分析:这可以转化为DAG上的最小路径覆盖问题. 路径覆盖的定义:有向图中,路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且 ...
随机推荐
- 教程-在F9后提示内存错误,点击了乎略,之后怎么取消乎略?
问题现象:F9后,调试程序,提示内存错误,点击了“乎略”.之后再也没有出现错误了.可是想改这个BUG时,没法取消乎略了. 问题原因:在DLEPHI的选项中是这么一个地方是可以设置的. 问题处理:打开D ...
- STC-ISP下载过程
- uva 315 Network(无向图求割点)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Unity3D之Mecanim动画系统学习笔记(二):模型导入
我们要在Unity3D中使用上模型和动画,需要经过下面几个阶段的制作,下面以一个人形的模型开发为准来介绍. 模型制作 模型建模(Modelling) 我们的美术在建模时一般会制作一个称为T-Pose( ...
- memcached构建集群分析之一
memcached本身是不支持集群的,集群所关注的容灾.容错.宕机恢复机制统统都没有,实战中需要自己实现容灾机制. memcached集群相比memcached的优势: 巨量数据分布到集群的多台应用主 ...
- 安装centreon
Centreon + nagios + ndoutils 安装 2013-09-25 19:42:44 标签:centreon 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者 ...
- CentOS6.4 64位系统安装jdk
1. CentOS操作安装好了以后,系统自带了openJDK,先查看相关的安装信息: $rpm -qa | grep java tzdata-java-2013b-1.el6.noarchjava-1 ...
- Unix: How to Install BerkeleyDB From Source
http://www.masaokitamura.com/2010/07/23/unix-how-to-install-berkeleydb-from-source/ This documentati ...
- ADO.NET 快速入门(一):ADO.NET 概述
ADO.NET 概述 ADO.NET是改进的ADO数据访问模型用于开发可扩展应用程序.他是专门为可伸缩性.无状态和XML核心的web而设计的. ADO.NET使用一些ADO对象,如Connecti ...
- Codeforces Round #172 (Div. 2) B. Nearest Fraction 二分
B. Nearest Fraction Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/281/p ...