[SCOI2008]城堡
题目描述
在一个国家里,有n个城市(编号为0 到n-1)。这些城市之间有n条双向道
路相连(编号为0 到n-1),其中编号为i的道路连接了城市i和城市ri(一条道
路可以连接一个城市和它自身),长度为di。n 个城市中有m个拥有自己城堡,
可以抵御敌人侵略。如果没有城堡的城市遭受攻击,则离它最近的城堡将派兵前
往救援。
你的任务是在不超过k个没有城堡的城市中建立城堡,使得所有城市中“离
最近城堡的距离”的最大值尽量小。换句话说,若令dist(c)表示城市c的最近城
堡离它的距离,则你的任务是让max{dist(c)}尽量小。
输入数据保证存在方案使得对于每个城市,至少有一个城堡能够到达。
输入输出格式
输入格式:
输入第一行为三个正整数n, m, k。第二行包含n个整数r0,r1,…,rn-1。第三行
包含n 个整数d0,d1,…,dn-1。第四行包含m 个各不相同的0~n-1 之间的整数,分
别为m个城堡所在的城市编号。
输出格式:
输出仅一行,包含一个整数,即max{dist(c)}的最小值。
输入输出样例
说明
100%的数据满足:2<=n<=50, 1<=di<=106, 0<=m<=n-k
先存图,直接用floyd求出最短路
继续二分最大长度mid,对于每个已有城堡的城市,直接去标记其能到达的城市
然后对于不能到达的
我们将其距离不超过枚举的mid的点期望+1,分别在k次中每次找到最大期望的值进行建城堡。
有个玄学:在比较找出最大期望相同时要找编号尽量大的?????
复杂度O(n^3+logd*k*n^2)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,k;
long long dis[][];
int cnt[],vis[],ans,p[],son[];
void find(int mid)
{int i,j,Max,maxi;
memset(cnt,,sizeof(cnt));
for (i=;i<=n;i++)
if (vis[i]==)
{
for (j=;j<=n;j++)
if (dis[i][j]<=mid)
cnt[j]++;
}
Max=,maxi=;
for (i=;i<=n;i++)
if (cnt[i]>=Max)
{
Max=cnt[i];
maxi=i;
}
if (maxi==) return;
for (i=;i<=n;i++)
if (dis[maxi][i]<=mid) vis[i]=;
}
bool check(int mid)
{int i,j;
memset(vis,,sizeof(vis));
for (i=;i<=m;i++)
{
for (j=;j<=n;j++)
if (dis[p[i]][j]<=mid) vis[j]=;
}
for (i=;i<=k;i++)
find(mid);
for (i=;i<=n;i++)
if (vis[i]==) return ;
return ;
}
int main()
{int i,j;
long long d;
cin>>n>>m>>k;
memset(dis,/,sizeof(dis));
for (i=;i<=n;i++)
{
scanf("%d",&son[i]);
son[i]++;
}
int l=,r=;
for (i=;i<=n;i++)
{
scanf("%lld",&d);
dis[i][son[i]]=min(dis[i][son[i]],d);
dis[son[i]][i]=min(dis[i][son[i]],d);
r+=d;
}
for (l=;l<=n;l++)
for (i=;i<=n;i++)
if (i!=l)
{
for (j=;j<=n;j++)
if (l!=j&&i!=j)
{
dis[i][j]=min(dis[i][j],dis[i][l]+dis[l][j]);
}
}
for (i=;i<=n;i++)
dis[i][i]=;
for (i=;i<=m;i++)
scanf("%d",&p[i]),p[i]++;
l=;
while (l<=r)
{
int mid=(l+r)/;
if (check(mid)) ans=mid,r=mid-;
else l=mid+;
}
cout<<ans;
}
[SCOI2008]城堡的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 1078: [SCOI2008]斜堆
1078: [SCOI2008]斜堆 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 770 Solved: 422[Submit][Status][ ...
- 【BZOJ1076】[SCOI2008]奖励关 状压DP+期望
[BZOJ1076][SCOI2008]奖励关 Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须 ...
- vijos1059 积木城堡[n年浙江省队第X轮](背包的方案总数 or 01背包)
描述 XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大, ...
- HDU1269 迷宫城堡
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- HD1269迷宫城堡(有向图 && 划分连通块)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 【bzoj1078】[SCOI2008]斜堆
2016-05-31 16:34:09 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1078 挖掘斜堆的性质233 http://www.cp ...
- bzoj 3399: [Usaco2009 Mar]Sand Castle城堡
3399: [Usaco2009 Mar]Sand Castle城堡 Time Limit: 3 Sec Memory Limit: 128 MB Description 约翰用沙子建了一座城堡.正 ...
- hdu 1269 迷宫城堡 强连通分量
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- C语言程序设计(基础)- 第4周作业
一.PTA作业 完成PTA第四周作业中8个题目,并将其中4个题目的思路列在博客中. 1.7-1 计算分段函数[1] 2.7-2 A除以B 3.7-6 阶梯电价 4.7-7 出租车计价 随笔具体书写内容 ...
- beta冲刺3
一,昨天的问题: 页面整理还没做 我的社团这边的后台数据库未完成,前端代码修改未完成. 二,今天已完成 页面整理基本完成,把登陆独立出来了,然后基本处理掉了多余页面(反正也没几个--) 我的社团这边试 ...
- 201421123042 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 答: 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计 ...
- 第四十八条:如果需要精确的答案,请避免使用float和double
让一个float或者double精确的表示0.1或者10的任何负数次方值都是不可能.float和double它们执行二进制浮点运算, 它们是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的 ...
- hp MSA50 5盘RAID5重建为4盘RAID5怎么恢复数据
[用户单位] XX省电视台[数据恢复故障描述] 一台HP 服务器,挂接一台HP MSA50磁盘阵列,内接5块1TB硬盘,原先结构为RAID5. 使用一段时间后,其中一块硬盘掉线,因RAID5支持一块硬 ...
- 【Fungus入门】10分钟快速构建Unity中的万能对话系统 / 叙事系统 / 剧情系统
我真的很久没有写过一个完整的攻略了(笑),咸鱼了很久之后还是想来写一个好玩的.这次主要是梳理一下Unity的小众插件Fungus的核心功能,并且快速掌握其使用方法. 官方文档:http://fungu ...
- python 中os.path.join 双斜杠的解决办法
这两天在写东西的时候遇到了这个问题,主要是上传图片之后,无法在页面展示,原因就出在用join 拼接的路径中出现了"\"而造成的. >>> import os &g ...
- Jenkins 安装、配置与项目新建及构建
1.Jenkins的安装与配置 1.1 java环境配置 Jenkins基于Java, Linux下安装java只要配置java环境变量即可. 首先,解压java到相应目录,我一般习惯把安装的软件放到 ...
- SpringBoot+Angular2 开发环境搭建
https://segmentfault.com/a/1190000007921675
- SLF4J - 一个允许你统一日志记录API的抽象层
一.什么是SLF4J 我们在做Java开发时,如果需要记录日志,有很多日志API可供选择,如: java.util.logging Apache log4j logback SLF4J又是个什么东东呢 ...