/*
考试的时候没想出正解 也没打暴力 时间不够了
随便yy了几种情况按出现的先后顺序处理而没有贪心
的了20分 不粘了
正解是围绕首都的儿子来搞的
显然先二分答案 对于每个限定的最大时间
我们尝试着那每个军队向根节点蹦 能蹦到的记下来最靠近根的点 并记下剩下多少时间
不能蹦到的 记下能蹦到哪里 并且标记为已有军队
最后updata一下不能蹦到的 说不定可以蹦到首都的儿子 或者首都的儿子的儿子都能蹦到
这里自己脑补一下图吧 很好理解的
然后我们就有了一些需要军队驻扎的首都的儿子还有到能到首都的军队及剩下的时间
然后开始分配 这里我们贪心的来搞
枚举还能移动的军队 首先看看他来的那个儿子是否需要军队 如果需要就过去
否则的话移动到它刚刚能到的最近的
最后统计一下是不是所有的需要军队的首都的儿子都有军队了 */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 50010
using namespace std;
int n,m,num,head[maxn],fa[maxn][],dis[maxn][],f[maxn],ans=-;
int p[maxn],sc,sg;
struct Children
{
int t,c;
}cl[maxn];
struct Get
{
int d,fr;
}get[maxn];
struct node
{
int v,t,pre;
}e[maxn*];
int cmp1(const Children &x,const Children &y)
{
return x.t<y.t;
}
int cmp2(const Get &x,const Get &y)
{
return x.d<y.d;
}
void Clear()
{
memset(f,,sizeof(f));
sc=sg=;
}
void Add(int from,int to,int dis)
{
num++;e[num].v=to;
e[num].t=dis;
e[num].pre=head[from];
head[from]=num;
}
void init()
{
scanf("%d",&n);
int x,y,z;
for(int i=;i<=n-;i++)
{
scanf("%d%d%d",&x,&y,&z);
Add(x,y,z);Add(y,x,z);
}
}
void Dfs(int now,int from,int len)
{
fa[now][]=from;dis[now][]=len;
for(int i=head[now];i;i=e[i].pre)
if(e[i].v!=from)
Dfs(e[i].v,now,e[i].t);
}
void Get_fa()
{
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
{
fa[i][j]=fa[fa[i][j-]][j-];
dis[i][j]=dis[i][j-]+dis[fa[i][j-]][j-];
}
}
void Up(int now,int from)
{
int falg=,isleaf=;
for(int i=head[now];i;i=e[i].pre)
if(e[i].v!=from)
{
isleaf=;Up(e[i].v,now);
if(f[e[i].v]==)falg=;
}
if(!falg&&!isleaf)f[now]=;
}
bool Judge(int x)
{
Clear();
for(int k=;k<=m;k++)
{
int sum=,a=p[k];
for(int i=;i>=;i--)
if(fa[a][i]&&sum+dis[a][i]<=x)
{
sum+=dis[a][i];
a=fa[a][i];
}
if(a!=)f[a]=;
else
{
cl[++sc].t=x-sum;a=p[k];
for(int i=;i>=;i--)
if(fa[a][i]>)a=fa[a][i];
cl[sc].c=a;
}
}
Up(,);
for(int i=head[];i;i=e[i].pre)
if(f[e[i].v]==)
{
get[++sg].fr=e[i].v;
get[sg].d=e[i].t;
}
sort(cl+,cl++sc,cmp1);
sort(get+,get++sg,cmp2);
int pi=;
for(int i=;i<=sc;i++)
{
while(f[get[pi].fr])pi++;
if(f[cl[i].c]==)
{
f[cl[i].c]=;
continue;
}
if(cl[i].t>=get[pi].d)
{
f[get[pi].fr]=;
pi++;
}
}
for(int i=;i<=sg;i++)
if(f[get[i].fr]==)return ;
return ; }
void slove()
{
scanf("%d",&m);
for(int i=;i<=m;i++)
scanf("%d",&p[i]);
int l=,r=0x3f3f3f3f;
while(l<=r)
{
int mid=(l+r)/;
if(Judge(mid))
{
r=mid-;ans=mid;
}
else l=mid+;
}
printf("%d\n",ans);
}
int main()
{
//freopen("blockade.in","r",stdin);
//freopen("blockade.out","w",stdout);
init();
Dfs(,,);
Get_fa();
slove();
return ;
}

noip 2012 疫情控制的更多相关文章

  1. 【NOIP 2012 疫情控制】***

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...

  2. NOIP 2012 疫情控制(二分+贪心+倍增)

    题解 二分时间 然后一个显然的事是一个军队向上爬的越高它控制的点越多 所以首先军队尽量往上爬. 当一个军队可以爬到根节点我们记录下它的剩余时间T和它到达根结点时经过的根节点的子节点son. 当一个军队 ...

  3. 基础算法(二分,贪心):NOIP 2012 疫情控制

    题目大意 给出一棵n个节点的树,根是1,要在除根节点以外的点建立检查点,使得从每条根到叶子的路径上都至少存在一个检查点.检查点由军队来建立.初始军队的位置是给定的,移动军队走一条边需要花费这条边的权值 ...

  4. 【NOIP】提高组2012 疫情控制

    [题意]n个点的树,1为根,要求删除一些点使得截断根节点和所有叶子结点的路径(不能删根,可以删叶子).有m支军队在m个点上,每时刻所有军队可以走一步,最终走到的地方就是删除的点,求最短时间. [算法] ...

  5. Codevs 1218 疫情控制 2012年NOIP全国联赛提高组

    1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...

  6. 疫情控制 2012年NOIP全国联赛提高组(二分答案+贪心)

    P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...

  7. [NOIP2012] 提高组 洛谷P1084 疫情控制

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...

  8. [NOIP2012] day2 T3疫情控制

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到 ...

  9. 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制

    P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...

随机推荐

  1. CSS远程加载字体

    CSS 远程加载字体的方法,做网站CSS的都知道,用户浏览网站时,网页上的字体是加载本地的.换言之,如果网站使用了用户电脑所没有安装的字体,那显示字体就会被默认字体所代替了,自然效果就大受影响了. 上 ...

  2. Python自动化运维之27、Django(一)

    一.概述 1.什么是框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单说就是使用别人搭好的舞台,你来做表演. 2.常 ...

  3. To Build A Dev Env On Linux(Ubuntu)

    Step1:System Installing 1)use iso image to Step2:Configuration Step3:Software Installing Step4:Other ...

  4. while if 循环判断

    temp=input("猜一下我想的那个数字吧:") guess=int(temp) while guess!=8: temp=input("诶呀错误了在输入一次吧:&q ...

  5. 关于移动手机端富文本编辑器qeditor图片上传改造

    日前项目需要在移动端增加富文本编辑,上网找了下,大多数都是针对pc版的,不太兼容手机,当然由于手机屏幕小等原因也限制富文本编辑器的众多强大功能,所以要找的编辑器功能必须是精简的. 找了好久,发现qed ...

  6. 关于float与double

    //float与double的范围和精度 1. 范围 float和double的范围是由指数的位数来决定的. // float的指数位有8位,而double的指数位有11位,分布如下:// float ...

  7. java和javascript获取word文档的书签位置对比

    1.javascript:把IE浏览器的activex都打开,使用如下网页,可以看到书签顺序和位置: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  8. LPSTR、LPCSTR、LPTSTR、LPCTSTR、LPWSTR及LPCWSTR的意义及区别

    引用 LPSTR.LPCSTR.LPTSTR.LPCTSTR.LPWSTR及LPCWSTR的意义及区别 1.ANSI(即MBCS):为多字节字符集,它是不定长表示世界文字的编码方式.ANSI表示英文字 ...

  9. 使用CSS为图片添加边框的几种方法

    css的应用十分广泛,即便用在图片的效果中也是方法多样,本文下面就介绍五种为图片添加特殊效果边框的CSS写法阴影效果 通过使用带有一些padding之的背景图来添加阴影效果. HTML <img ...

  10. HDU 5501 背包问题

    需要按照B/C的值从大到小排序. #include<cstdio> #include<cstring> #include<iostream> #include< ...