题目描述

在一个国家里,有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)}的最小值。

输入输出样例

输入样例#1:
复制

5 0 1
1 2 3 4 0
1 1 1 1 1
输出样例#1: 复制

2
输入样例#2: 复制

3 1 1
1 2 0
1 2 3
2
输出样例#2: 复制

1
输入样例#3: 复制

3 1 1
1 2 0
1 2 3
2
输出样例#3: 复制

0
输入样例#4: 复制

10 3 3
0 2 0 0 2 2 8 3 8 7
10 9 1 8 1 3 7 2 8 1
3 4 6
输出样例#4: 复制

3
输入样例#5: 复制

2 0 1
1 0
5 10
输出样例#5: 复制

5

说明

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]城堡的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. BZOJ 1078: [SCOI2008]斜堆

    1078: [SCOI2008]斜堆 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 770  Solved: 422[Submit][Status][ ...

  3. 【BZOJ1076】[SCOI2008]奖励关 状压DP+期望

    [BZOJ1076][SCOI2008]奖励关 Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须 ...

  4. vijos1059 积木城堡[n年浙江省队第X轮](背包的方案总数 or 01背包)

    描述 XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大, ...

  5. HDU1269 迷宫城堡

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  6. HD1269迷宫城堡(有向图 && 划分连通块)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. 【bzoj1078】[SCOI2008]斜堆

    2016-05-31 16:34:09 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1078 挖掘斜堆的性质233 http://www.cp ...

  8. bzoj 3399: [Usaco2009 Mar]Sand Castle城堡

    3399: [Usaco2009 Mar]Sand Castle城堡 Time Limit: 3 Sec  Memory Limit: 128 MB Description 约翰用沙子建了一座城堡.正 ...

  9. hdu 1269 迷宫城堡 强连通分量

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. C第十八次课

    总结知识点: 指针 1.指针变量 指针变量的定义:例8.1 指针变量的引用:例8.2: 指针变量作为函数参数:例8.3 swap函数,例8.4 比较排序函数 2.指针数组 数组元素的指针:int *p ...

  2. Build to win

    UPDATE:看到周筠老师的评论里的链接,那版式真的非常舒服.我想想模仿模仿他的布局来看看,虽然感觉做的也不是太好.另外对博客内容稍作修改. 一.获得小黄衫的感受 很幸运能够获得"领骑衫&q ...

  3. 20162323周楠《Java程序设计与数据结构》第八周总结

    20162323周楠 2016-2017-2 <程序设计与数据结构>第八周学习总结 教材学习内容总结 一个异常是一个对象,它定义了并不轻易出现的或是错误的情形 异常由程序或运行时环境抛出, ...

  4. C语言——第四次作业

    题目 题目一:计算分段函数 1.实验代码 #include <stdio.h> int main() { double x,y; scanf("%lf",&x) ...

  5. 201621123043 《Java程序设计》第1周学习总结

    1. 本章学习总结 Jdk的安装: eclipse的基本使用方法 Java发展史 jdk.jre.jvm 关键词之间的联系:是整个java的核心,包括了一堆java.java基础的类库.java运行环 ...

  6. Flask 扩展 Flask-PyMongo

    安装 pip install Flask-PyMongo 初始化Pymongo实例 from flask import Flask from flask.ext.pymongo import PyMo ...

  7. Linux 下的权限改变与目录配置

    Linux 下的权限改变与目录配置 ./代表本目录的意思. (1):用户与用户组, 1:文件所有者,文件被某一用户所有 2:用户组:    对文件给与一个或者多个用户权限配置 3:其它人: (2):l ...

  8. [Redis源码阅读]redis持久化

    作为web开发的一员,相信大家的面试经历里少不了会遇到这个问题:redis是怎么做持久化的? 不急着给出答案,先停下来思考一下,然后再看看下面的介绍.希望看了这边文章后,你能够回答这个问题. 为什么需 ...

  9. 【转】Python处理wave文件

    #本文PDF版下载 Python解析Wav文件并绘制波形的方法 #本文代码下载 Wav波形绘图代码 #本文实例音频文件night.wav下载 音频文件下载 (石进-夜的钢琴曲) 前言 在现在繁忙的生活 ...

  10. ubuntu启动报/root/.profile mesg:ttyname failed错误的解决办法

    修改/root/.profile文件,如下命令 sudo gedit /root/profile 将文中的最后一行mesg n修改成tty -s && mesg n