codevs 1218 疫情控制
啊好烦这道题。。。。
基本思路网上都有。
注意的一点是在匹配的时候,如果有军队的来源没有被匹配到,那么就先匹配这个来源。(因为不花钱)。
不过数据好水。。。。
#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 疫情控制的更多相关文章
- Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...
- 【NOIP2012】 疫情控制
[NOIP2012] 疫情控制 标签: 倍增 贪心 二分答案 NOIP Description H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是 ...
- Luogu 1084 NOIP2012 疫情控制 (二分,贪心,倍增)
Luogu 1084 NOIP2012 疫情控制 (二分,贪心,倍增) Description H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是 ...
- [NOIP2012]疫情控制 贪心 二分
题面:[NOIP2012]疫情控制 题解: 大体思路很好想,但是有个细节很难想QAQ 首先要求最大时间最小,这种一般都是二分,于是我们二分一个时间,得到一个log. 然后发现一个军队,越往上走肯定可以 ...
- 疫情控制 blockade
疫情控制 blockad 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当 ...
- codevs1218 疫情控制
疫情控制(blockade.cpp/c/pas)[问题描述]H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点.H 国的首都爆发了一种危害 ...
- 疫情控制 2012年NOIP全国联赛提高组(二分答案+贪心)
P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...
- CH6301 疫情控制
6301 疫情控制 0x60「图论」例题 描述 H国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病. ...
- luoguP1084 疫情控制(题解)(搜索+贪心)
luoguP1084 疫情控制 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include& ...
随机推荐
- hadoop 数据采样
http://www.cnblogs.com/xuxm2007/archive/2012/03/04/2379143.html 原文地址如上: 关于Hadoop中的采样器 .为什么要使用采样器 在这个 ...
- 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 ...
- windows 下c++编译
http://blog.csdn.net/dyllove98/article/details/9314993
- 提升SQL Server速度整理索引碎片
转载:http://wenku.baidu.com/view/f64c8a707fd5360cba1adbea.html SQL Server2005索引碎片分析和解决方法 毫无疑问,给表添加索引 ...
- Appium绑定
锁定 锁定屏幕 # python driver.lock(5) 将 app 置于后台 把当前应用放到后台去 # python driver.background_app(5) 收起键盘 收起键盘 # ...
- Chp17: Moderate
17.1 swap a number in place.(without temporary variables) a = a ^ b; b = a ^ b; a = a ^ b; 17.3 Writ ...
- Python图片转换成矩阵,矩阵数据转换成图片
# coding=gbk from PIL import Image import numpy as np # import scipy def loadImage(): # 读取图片 im = Im ...
- lintcode:在二叉查找树中插入节点
题目: 在二叉查找树中插入节点 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树. 样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样 ...
- jquery通过ajax-json访问java后台传递参数,通过request.getParameter获取不到参数的说明
http://m.blog.csdn.net/blog/eyebrother/36007145 所以当后台通过request.getParameter("name");对参数值的作 ...
- ASP.NET并发处理
http://blog.csdn.net/hliq5399/article/details/6280288