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& ...
随机推荐
- Sublime key bindings使用
开启vi mode后,可以使用很多的VI快捷方式,所以我的sublime已经不是单纯的st了,st的VI模式不完全支持所有的快捷键.我们来看一段官网的key bindings示例: { "k ...
- CSS学习------之简单图片切换
最近一直在重温纯CSS,学习的时候真的才发现,css真的博大精深啊! 所以趁着学习的劲头,谢了个最简单的CSS图片切换! 先整理下思路: 首先我希望图片居中间,两边有个切换按钮,点击按钮的时候,可以实 ...
- MATLAB三维散点图的绘制(scatter3、plot3)
MATLAB三维散点图的绘制(scatter3.plot3) (1)函数scatter3 用法:scatter3(x,y,z,'.',c) % c 为颜色,需和x,y,z长度相同 例子: x=[422 ...
- Codeforces Round #241 (Div. 2)->A. Guess a number!
A. Guess a number! time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Python-aiohttp百万并发
http://www.aikaiyuan.com/10935.html 本文将测试python aiohttp的极限,同时测试其性能表现,以分钟发起请求数作为指标.大家都知道,当应用到网络操作时,异步 ...
- Android中数据存储之SharedPreferences
import android.content.Context; import android.content.SharedPreferences; import android.content.Sha ...
- StringBuffer的用法
StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...
- mysql级联更新的两种方式:触发器更新和外键
1.mysql级联更新有两种方式:触发器更新和外键更新. 2.触发器更新和外键更新的目的都是为了保证数据完整性. 我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1 ...
- Linux系统与性能监控
原文地址:http://kerrigan.sinaapp.com/post-7.html Linux System and Performance Monitoring http://www.hous ...
- C++:虚基类
4.4.3 虚基类1.没什么要引入虚基类 如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多分同名成员.在访问这些同名的成员时,必须在 ...