2286: [Sdoi2011消耗战

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 2082  Solved: 736
[Submit][Status][Discuss]

Description

在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望。已知在其他k个岛屿上有丰富能源,为了防止敌军获取能源,我军的任务是炸毁一些桥梁,使得敌军不能到达任何能源丰富的岛屿。由于不同桥梁的材质和结构不同,所以炸毁不同的桥梁有不同的代价,我军希望在满足目标的同时使得总代价最小。
侦查部门还发现,敌军有一台神秘机器。即使我军切断所有能源之后,他们也可以用那台机器。机器产生的效果不仅仅会修复所有我军炸毁的桥梁,而且会重新随机资源分布(但可以保证的是,资源不会分布到1号岛屿上)。不过侦查部门还发现了这台机器只能够使用m次,所以我们只需要把每次任务完成即可。

Input

第一行一个整数n,代表岛屿数量。

接下来n-1行,每行三个整数u,v,w,代表u号岛屿和v号岛屿由一条代价为c的桥梁直接相连,保证1<=u,v<=n且1<=c<=100000。

第n+1行,一个整数m,代表敌方机器能使用的次数。

接下来m行,每行一个整数ki,代表第i次后,有ki个岛屿资源丰富,接下来k个整数h1,h2,…hk,表示资源丰富岛屿的编号。

Output

输出有m行,分别代表每次任务的最小代价。

Sample Input

10
1 5 13
1 9 6
2 1 19
2 4 8
2 3 91
5 6 8
7 5 4
7 8 31
10 7 9
3
2 10 6
4 5 7 8 3
3 9 4 6

Sample Output

12
32
22

HINT

对于100%的数据,2<=n<=250000,m>=1,sigma(ki)<=500000,1<=ki<=n-1

Source

Stage2 day2


虚树入门题,如果你想知道虚树如何构造:http://user.qzone.qq.com/872191552/main

DP

记dis[i]为点i到根节点的路径中最小的边的权值

f[i]=min(dis[i],sigma f[son[i]]);


 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#define maxn 500100
#define llg long long
using namespace std;
struct node
{
llg df,po;
}d[maxn];
llg i,j,k,n,m,p[maxn][],dad[maxn],bj[maxn],dfs[maxn],cnt,T,deep[maxn],dis[maxn],se[maxn],q,ss[maxn],open,dl[maxn];
vector <llg> a[maxn],c[maxn],val[maxn];
stack <llg> z; inline int getint(){
char c=getchar(); llg w=,q=;
while(c!='-' && ( c<'' || c>'')) c=getchar();
if(c=='-') c=getchar(),q=;
while(c>='' && c<='') w=w*+c-'',c=getchar();
return q?-w:w;
} void link(llg x,llg y,llg z) {a[x].push_back(y); val[x].push_back(z); val[y].push_back(z); a[y].push_back(x);} void link_(llg x,llg y) {c[x].push_back(y); c[y].push_back(x);} bool cmp(const node&a,const node&b){return a.df<b.df;} void find_dad_deep(llg x,llg di)
{
bj[x]=; dfs[x]=++cnt; dis[x]=di;
llg w=a[x].size();
for (llg i=;i<w;i++)
if (!bj[a[x][i]])
{
dad[a[x][i]]=x; p[a[x][i]][]=x; deep[a[x][i]]=deep[x]+;
find_dad_deep(a[x][i],min(di,val[x][i]));
}
} void build_lca()
{
for (i=;(<<i)<=n;i++)
for (j=;j<=n;j++)
p[j][i]=p[p[j][i-]][i-];
} llg lca(llg x,llg y)
{
if (deep[x]<deep[y]) swap(x,y);
for (llg i=;i>=;i--) if (deep[p[x][i]]>=deep[y]) x=p[x][i];
if (x==y) return x;
for (llg i=;i>=;i--)
if (p[x][i]!=p[y][i]) {x=p[x][i]; y=p[y][i];}
return dad[x];
} llg st[maxn],top; void make_tree(llg x)
{
llg L=,g1,g2;
while(top)
{
g1=st[top];g2=st[top-];L=lca(g1,x);
if(deep[g2]>deep[L]) link_(g2,g1),top--;
else if(deep[g2]<deep[L]) {link_(g1,L);top--;break;}
else break;
}
if(st[top]!=L) st[++top]=L;
st[++top]=x;
} void ceshi()
{
for (llg i=;i<=n;i++)
{
llg w=c[i].size();
for (llg j=;j<w;j++) if (i<c[i][j]) cout<<i<<" "<<c[i][j]<<endl;
}
} llg dp(llg x)
{
bj[x]=;
dl[++open]=x;
llg w=c[x].size(),tot=;
for (llg i=;i<w;i++)
if (!bj[c[x][i]])
tot+=dp(c[x][i]);
if (ss[x]) return dis[x];
return min(tot,dis[x]);
} int main()
{
freopen("a.in","r",stdin); freopen("a.out","w",stdout);
cin>>n;
for (i=;i<n;i++)
{
llg x,y,z;
x=getint(),y=getint(),z=getint();
link(x,y,z);
}
deep[]=;
llg ggg=(llg)1e60;
find_dad_deep(,ggg); //dis[1]=0;
build_lca();
cin>>T; for (i=;i<=n;i++) bj[i]=;
while (T--)
{
m=getint();
llg x;
for (i=;i<=open;i++) {ss[se[i]]=; c[dl[i]].clear(); bj[dl[i]]=;}
q=,open=;
c[].clear(); bj[]=; ss[]=;
for (i=;i<=m;i++) {x=getint(); d[i].po=x; d[i].df=dfs[x]; q++; ss[x]=; se[q]=x; }
sort(d+,d+m+,cmp);
top=;
if (d[].po!=) st[++top]=;
for (i=;i<=m;i++) make_tree(d[i].po);
while(top!=) link_(st[top],st[top-]),top--;
//if (q<=0) printf("0\n"); else
printf("%lld\n",dp());
//ceshi();
//cout<<endl;
}
return ;
}

BZOJ 2286: [Sdoi2011]消耗战的更多相关文章

  1. bzoj 2286: [Sdoi2011]消耗战 虚树+树dp

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 在一 ...

  2. bzoj 2286 [Sdoi2011]消耗战(虚树+树上DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2286 [题意] 给定一棵树,切断一条树边代价为ci,有m个询问,每次问使得1号点与查询 ...

  3. bzoj 3611: [Heoi2014]大工程 && bzoj 2286: [Sdoi2011消耗战

    放波建虚树的模板. 大概是用一个栈维护根节点到当前关键点的一条链,把其他深度大于lca的都弹出去. 每次做完记得复原. 还有sort的时候一定要加cmp!!! bzoj 3611 #include&l ...

  4. BZOJ 2286: [Sdoi2011]消耗战 虚树 树形dp 动态规划 dfs序

    https://www.lydsy.com/JudgeOnline/problem.php?id=2286 wa了两次因为lca犯了zz错误 这道题如果不多次询问的话就是裸dp. 一棵树上多次询问,且 ...

  5. BZOJ.2286.[SDOI2011]消耗战(虚树 树形DP)

    题目链接 BZOJ 洛谷P2495 树形DP,对于每棵子树要么逐个删除其中要删除的边,要么直接断连向父节点的边. 如果当前点需要删除,那么直接断不需要再管子树. 复杂度O(m*n). 对于两个要删除的 ...

  6. BZOJ 2286 [Sdoi2011]消耗战(虚树+树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2286 [题目大意] 出一棵边权树,每次给出一些关键点,求最小边割集, 使得1点与各个关 ...

  7. bzoj 2286: [Sdoi2011消耗战

    #include<cstdio> #include<iostream> #define M 1000009 #define N 250009 #define ll long l ...

  8. bzoj 2286 [Sdoi2011]消耗战 虚树+dp

    题目大意:多次给出关键点,求切断边使所有关键点与1断开的最小费用 分析:每次造出虚树,dp[i]表示将i和i子树与父亲断开费用 对于父亲x,儿子y ①y为关键点:\(dp[x]\)+=\(dismn( ...

  9. BZOJ 2286: [Sdoi2011消耗战 [DP 虚树]

    传送门 题意: 删除价值和最小的边使得$1$号点与$k$个关键点不连通 一个树形DP...但是询问多次,保证总的关键点数为$O(n)$ 先说一下这个$DP$ $f[i]$表示子树$i$中的关键点与$1 ...

随机推荐

  1. EmguCV 简单图形绘制

    一.圆 public static void cvCircle( IntPtr img, System.Drawing.Point center, //Center of the circle int ...

  2. 四个查找命令find,locate,whereis,which的区别

    find最强大,但是检索硬盘,比较慢: whereis只能查二进制文件.说明文档,源文件等: locate能查所有文件,但跟whereis一样都是查数据库里的内容,速度快,但有延时: which 只能 ...

  3. PHP读文件的一个乱码问题

    D:/3.txt是utf-8文件 $f1 = fopen('D:/3.txt','r');$str = fread($f1,10000);fclose($f1);echo substr($str,1, ...

  4. Cocos2dx集成于windows桌面窗口程序的步骤

    2D游戏需要做编辑器,而编辑器总是希望可以复用游戏中的逻辑来运行场景试看效果. 对于cocos2dx开发的程序,这个需求可以描述为: 实现一种方法,在桌面窗口程序中的某个控件上显示cocos2dx的场 ...

  5. Stream Processing for Everyone with SQL and Apache Flink

    Where did we come from? With the 0.9.0-milestone1 release, Apache Flink added an API to process rela ...

  6. Spring定时任务的几种实现

    近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合 spring框架来介绍. ...

  7. JSON和JS对象之间的互转(转)

    文章出处:http://www.cnblogs.com/dyllove98/p/4235909.html 1. jQuery插件支持的转换方式 $.parseJSON( jsonstr ); //jQ ...

  8. Tomcat热部署方法(3种)【转】

    热部署是指在你修改项目BUG的时候对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效.但是对配置文件的修改除外! 1.直接把项目web文件夹放在webapps里. 2.在tomcat ...

  9. css3渐变之linear-gradient与-webkit-linear-gradient写法异同

    语法background: linear-gradient(direction, color-stop1, color-stop2, ...); 通常只需要linear-gradient,兼容性较好. ...

  10. android MotionEvent获得当前位置

    event.getY()与event.getX()为当前触摸位置距离当前元素顶端和左端的距离: event.getRowY()与event.getRowX()为当前触摸位置距离当前屏幕顶端和左端的距离 ...