啊好烦这道题。。。。

基本思路网上都有。

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

不过数据好水。。。。

#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. 2186: [Sdoi2008]沙拉公主的困惑 - BZOJ

    Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...

  2. Leetcode#80 Remove Duplicates from Sorted Array II

    原题地址 简单模拟题. 从先向后遍历,如果重复出现2次以上,就不移动,否则移动到前面去 代码: int removeDuplicates(int A[], int n) { ) return n; ; ...

  3. css3选择器笔记

    通用选择器ul~p{}  为ul之后的所有p标签设置属性 (ul和p为同级元素)ul+p{} 仅为ul之后的p标签设置属性 (ul和p为相邻元素)div>p  为div之后的p标签设置属性{ d ...

  4. MonoBehaviour.StopCoroutine

    MonoBehaviour.StopCoroutine Description Stops all coroutines named methodName running on this behavi ...

  5. Sqlitekit 封装管理

    最近需要用到Sqlite数据库来做一个游戏的数据存储.网上搜了一下,两种方法,一种是自己dll搭建环境有可能还需要编译之类的,我自己是搭建出来了,不过我没采用. 还有一种就是使用sqlitekit插件 ...

  6. java后台生成zip打包文件

    /** * * @param zipFile 压缩包文件对象 * @param listKey 压缩的图片物理地址 * @return */ public static boolean package ...

  7. C# 委托的”四步走“

    看了一本<深入了解C#>感觉很不错,对于委托的讲解,给大家摘录了下来! 1.什么是委托 我的拙见:委托就是将方法作为参数,进行传递的 书中的记载:将某种行为“包含”在一个对象中,这个对象可 ...

  8. C# 知识笔记

    HttpContext.Request.Form.ToString() 获取Form表单中的内容 /// <summary> /// 获取 GET 提交方式值 /// </summa ...

  9. 【nginx运维基础(5)】Nginx的location攻略

    概述 location 有"定位"的意思, 根据Uri来进行不同的定位. 在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理方式上.伪静态,反 ...

  10. java登陆验证码与JS无刷新验证

    最近公司的项目的登陆模块由我负责,所以就做了个登陆小功能进行练手,其包括了用jQuery对用户名和密码进行不为null验证,和出于安全性考虑加了一个验证码的校验 别的不说先上代码 controller ...