啊好烦这道题。。。。

基本思路网上都有。

注意的一点是在匹配的时候,如果有军队的来源没有被匹配到,那么就先匹配这个来源。(因为不花钱)。

不过数据好水。。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 50050
#define maxe 100500
using namespace std;
int n,x,y,z,g[maxv],nume=,m,c[maxv],anc[maxv][],dis[maxv][],l=,r=,disr[maxv],kr=,fath[maxv];
int top=,cnt=;
bool vis[maxv],ret[maxv];
struct edge
{
int v,w,nxt;
}e[maxe];
struct status
{
int val,id;
}regis[maxv],stack[maxv];
bool cmp(status a,status b)
{
return a.val<b.val;
}
void addedge(int u,int v,int w)
{
e[++nume].v=v;
e[nume].w=w;
e[nume].nxt=g[u];
g[u]=nume;
}
void dfs1(int x,int father)
{
if (father==) fath[x]=x;
else if (x!=) fath[x]=fath[father];
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v!=father)
{
anc[v][]=x;dis[v][]=e[i].w;
disr[v]=disr[x]+e[i].w;r=max(r,disr[v]);
dfs1(v,x);
}
}
}
bool dfs2(int x,int father)
{
if (vis[x]) return true;
int cnt1=,cnt2=;
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v!=father)
{
cnt1++;
if (dfs2(v,x)) cnt2++;
}
}
if ((cnt1==cnt2) && (cnt1!=)) return true;
return false;
}
void get_table()
{
r+=kr;
for (int i=;i<=;i++)
for (int j=;j<=n;j++)
{
anc[j][i]=anc[anc[j][i-]][i-];
dis[j][i]=dis[j][i-]+dis[anc[j][i-]][i-];
}
}
int get_pnt(int x,int r)
{
for (int i=;i>=;i--)
{
if (r>=dis[x][i])
{
r-=dis[x][i];
x=anc[x][i];
}
}
return x;
}
bool check(int x)
{
memset(vis,false,sizeof(vis));
memset(ret,false,sizeof(ret));
top=;cnt=;
for (int i=;i<=m;i++)
{
int v=c[i];
if (disr[v]<x)
{
top++;
stack[top].val=x-disr[v];
stack[top].id=fath[v];
}
else if (disr[v]==x) vis[fath[v]]=true;
else vis[get_pnt(v,x)]=true;
}
for (int i=g[];i;i=e[i].nxt)
{
int v=e[i].v;
if (!dfs2(v,))
{
regis[++cnt].val=disr[v];
regis[cnt].id=v;
ret[v]=true;
}
}
if (top<cnt) return false;
sort(stack+,stack+top+,cmp);
sort(regis+,regis+cnt+,cmp);
int p1=,p2=;
while ((p2<=cnt) && (p1<=top))
{
if (ret[stack[p1].id]) {ret[stack[p1].id]=false;p1++;}
else
{
while ((!ret[regis[p2].id]) && (p2<=cnt)) p2++;
while ((stack[p1].val<regis[p2].val) && (p1<=top)) p1++;
if (p2==cnt+) break;
if (p1==top+) break;
ret[regis[p2].id]=false;p1++;p2++;
}
}
for (int i=g[];i;i=e[i].nxt)
{
int v=e[i].v;
if (ret[v]) return false;
}
return true;
}
int get_ans()
{
int ans;
while (l<=r)
{
int mid=(l+r)>>;
if (check(mid)) {ans=mid;r=mid-;}
else l=mid+;
}
return ans;
}
int main()
{
scanf("%d",&n);
for (int i=;i<=n-;i++)
{
scanf("%d%d%d",&x,&y,&z);
addedge(x,y,z);
addedge(y,x,z);
if ((x==) || (y==)) kr=max(kr,z);
}
scanf("%d",&m);
for (int i=;i<=m;i++)
scanf("%d",&c[i]);
dfs1(,);
get_table();
printf("%d\n",get_ans());
return ;
}

codevs 1218 疫情控制的更多相关文章

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

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

  2. 【NOIP2012】 疫情控制

    [NOIP2012] 疫情控制 标签: 倍增 贪心 二分答案 NOIP Description H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是 ...

  3. Luogu 1084 NOIP2012 疫情控制 (二分,贪心,倍增)

    Luogu 1084 NOIP2012 疫情控制 (二分,贪心,倍增) Description H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是 ...

  4. [NOIP2012]疫情控制 贪心 二分

    题面:[NOIP2012]疫情控制 题解: 大体思路很好想,但是有个细节很难想QAQ 首先要求最大时间最小,这种一般都是二分,于是我们二分一个时间,得到一个log. 然后发现一个军队,越往上走肯定可以 ...

  5. 疫情控制 blockade

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

  6. codevs1218 疫情控制

    疫情控制(blockade.cpp/c/pas)[问题描述]H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点.H 国的首都爆发了一种危害 ...

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

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

  8. CH6301 疫情控制

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

  9. luoguP1084 疫情控制(题解)(搜索+贪心)

    luoguP1084 疫情控制 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include& ...

随机推荐

  1. hadoop 数据采样

    http://www.cnblogs.com/xuxm2007/archive/2012/03/04/2379143.html 原文地址如上: 关于Hadoop中的采样器 .为什么要使用采样器 在这个 ...

  2. HDU 2121 Ice_cream’s world II 不定根最小树形图

    题目链接: 题目 Ice_cream's world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  3. windows 下c++编译

    http://blog.csdn.net/dyllove98/article/details/9314993

  4. 提升SQL Server速度整理索引碎片

    转载:http://wenku.baidu.com/view/f64c8a707fd5360cba1adbea.html SQL Server2005索引碎片分析和解决方法   毫无疑问,给表添加索引 ...

  5. Appium绑定

    锁定 锁定屏幕 # python driver.lock(5) 将 app 置于后台 把当前应用放到后台去 # python driver.background_app(5) 收起键盘 收起键盘 # ...

  6. Chp17: Moderate

    17.1 swap a number in place.(without temporary variables) a = a ^ b; b = a ^ b; a = a ^ b; 17.3 Writ ...

  7. Python图片转换成矩阵,矩阵数据转换成图片

    # coding=gbk from PIL import Image import numpy as np # import scipy def loadImage(): # 读取图片 im = Im ...

  8. lintcode:在二叉查找树中插入节点

    题目:  在二叉查找树中插入节点 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树.  样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样 ...

  9. jquery通过ajax-json访问java后台传递参数,通过request.getParameter获取不到参数的说明

    http://m.blog.csdn.net/blog/eyebrother/36007145 所以当后台通过request.getParameter("name");对参数值的作 ...

  10. ASP.NET并发处理

    http://blog.csdn.net/hliq5399/article/details/6280288