题目:

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

题解:

先发泄一下:

bzoj输出量大了不能用cout!!!!!!!

bzoj输出量大了不能用cout!!!!!!!

bzoj输出量大了不能用cout!!!!!!!

艹艹艹艹艹艹卡了我一个下午!!!!!

接下说下关于虚树的知识:

然后这道题就是虚树+简单的树形dp即可,注意在新建虚树边的时候不要直接memset,否则会超时····

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int dfn[N],first[N],go[N*],nxt[N*],tot=,n,m,g[N][],deep[N],cnt=,vn,tn,tem;
int tot1=,first1[N],go1[N*],next1[N*],par[N],tag[N];
int vir[N],stack[N],top=;
long long dp[N],val[N*],minn[N];
inline void comb(int a,int b,long long c)
{
nxt[++tot]=first[a],first[a]=tot,go[tot]=b,val[tot]=c;
nxt[++tot]=first[b],first[b]=tot,go[tot]=a,val[tot]=c;
}
inline void comb1(int a,int b)
{
next1[++tot1]=first1[a],first1[a]=tot1,go1[tot1]=b;
}
inline int R()
{
char c;
int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar())
f=(f<<)+(f<<)+c-'';
return f;
}
inline long long Rl()
{
char c;
long long f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar())
f=f*+c-'';
return f;
}
inline void dfs(int u,int fa)
{
dfn[u]=++cnt;
for(int e=first[u];e;e=nxt[e])
{
int v=go[e];
if(v==fa) continue;
deep[v]=deep[u]+;
g[v][]=u;
minn[v]=min(minn[u],val[e]);
dfs(v,u);
}
}
inline int get(int a,int b)
{
int i,j;
if(deep[a]<deep[b]) swap(a,b);
for(i=;(<<i)<=deep[a];i++);
i--;
for(j=i;j>=;j--)
{
if(deep[a]-(<<j)>=deep[b])
a=g[a][j];
}
if(a==b) return a;
for(j=;j>=;j--)
{
if(g[a][j]!=g[b][j])
{
a=g[a][j];
b=g[b][j];
}
}
return g[a][];
}
inline void pre()
{
tot1=,stack[top=]=,tem++;
}
bool cmp(const int &a,const int &b)
{
return dfn[a]<dfn[b];
}
inline void build()
{
sort(vir+,vir+vn+,cmp);
vn=unique(vir+,vir+vn+)-vir-;
tn=vn;
for(int i=;i<=tn;i++)
{
int u=vir[i];
if(!top)
{
par[u]=;
stack[++top]=u;
continue;
}
int lca=get(stack[top],u);
while(deep[stack[top]]>deep[lca])
{
if(deep[stack[top-]]<deep[lca]) par[stack[top]]=lca;
top--;
}
if(stack[top]!=lca)
{
vir[++vn]=lca;
par[lca]=stack[top];
stack[++top]=lca;
}
par[u]=lca;
stack[++top]=u;
}
sort(vir+,vir+vn+,cmp);
}
inline long long solve(int u)
{
if(tag[u]==tem)
return minn[u];
dp[u]=minn[u];
long long temp=;
bool flag=false;
for(int e=first1[u];e;e=next1[e])
{
int v=go1[e];
flag=true;
temp+=solve(v);
}
if(flag) dp[u]=min(dp[u],temp);
return dp[u];
}
int main()
{
//freopen("a.in","r",stdin);
n=R();
int a,b;
long long c;
for(int i=;i<n;i++)
{
a=R(),b=R(),c=Rl();
comb(a,b,c);
}
minn[]=1e+;
deep[]=;
dfs(,);
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
g[j][i]=g[g[j][i-]][i-];
m=R();
for(int i=;i<=m;i++)
{
pre(),vn=R();
for(int j=;j<=vn;j++)
vir[j]=R(),tag[vir[j]]=tem;
build();
for(int j=;j<=vn;j++)
first1[vir[j]]=dp[vir[j]]=;
for(int j=;j<=vn;j++)
comb1(par[vir[j]],vir[j]);
dp[vir[]]=solve(vir[]);
printf("%lld\n",dp[vir[]]);
}
return ;
}

算法复习——虚树(消耗战bzoj2286)的更多相关文章

  1. 虚树+【BZOJ2286】【SDOI2011】消耗战(虚树)(DP)

    先看一道题: [BZOJ2286][SDOI2011]消耗战 Description 在一场战争中,战场由n个岛屿和n−1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总 ...

  2. 算法复习——矩阵树定理(spoj104)

    题目: In some countries building highways takes a lot of time... Maybe that's because there are many p ...

  3. 算法复习——trie树(poj2001)

    题目: 题目描述 给出 n 个单词(1<=n<=1000),求出每个单词的非公共前缀,如果没有,则输出自己. 输入格式 输入 N 个单词,每行一个,每个单词都是由 1-20 个小写字母构成 ...

  4. 【BZOJ】2286: [Sdoi2011]消耗战 虚树+DP

    [题意]给定n个点的带边权树,每次询问给定ki个特殊点,求隔离点1和特殊点的最小代价.n<=250000,Σki<=500000. [算法]虚树+DP [题解]考虑普通树上的dp,设f[x ...

  5. 【BZOJ】3572: [Hnoi2014]世界树 虚树+倍增

    [题意]给定n个点的树,m次询问,每次给定ki个特殊点,一个点会被最近的特殊点控制,询问每个特殊点控制多少点.n,m,Σki<=300000. [算法]虚树+倍增 [题解]★参考:thy_asd ...

  6. 【BZOJ】3991: [SDOI2015]寻宝游戏 虚树+DFS序+set

    [题意]给定n个点的带边权树,对于树上存在的若干特殊点,要求任选一个点开始将所有特殊点走遍后返回.现在初始没有特殊点,m次操作每次增加或减少一个特殊点,求每次操作后的总代价.n,m<=10^5. ...

  7. 【学习笔记】虚树复习记(BZOJ2286 SDOI2011 消耗战)

    想写战略游戏却想不起来虚树T^T 所以就有了这篇复习记QwQ ——简介!—— 我们在处理树上问题的时候,dfs是一个常用手段,但是我们发现,如果一棵树上只有一部分关键点,每次dfs需要访问好多不是关键 ...

  8. 【BZOJ2286】消耗战(虚树,动态规划)

    [BZOJ2286]消耗战(虚树,动态规划) 题面 BZOJ Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总 ...

  9. [BZOJ2286][SDOI2011]消耗战(虚树DP)

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4998  Solved: 1867[Submit][Statu ...

随机推荐

  1. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} 解决方法

    Tomcat启动时出现红色警告内容 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'sour ...

  2. ycsb安装和使用介绍

    nosql性能测试工具ycsb0.1的使用 使用文档参考地址:https://www.cnblogs.com/SailorXiao/p/5808828.html ycsb地址:https://gith ...

  3. MySQL存储过程简介和引擎说明

  4. JS中的delete操作符

    首先,delete删除成功返回true,失败返回false. js代码: function wxCount ($element) { this.init($element); } wxCount.pr ...

  5. Spring根据XML配置文件注入对象类型属性

    这里有dao.service和Servlet三个地方 通过配过文件xml生成对象,并注入对象类型的属性,降低耦合 dao文件代码: package com.swift; public class Da ...

  6. Mac OSX用 dd 命令,浇灌ISO镜像到USB驱动器

    Mac OSX用 dd 命令,浇灌ISO镜像到USB驱动器 字数244 阅读197 评论0 喜欢0 把ISO镜像转换为一个可启动的USB设备.一种可行的方法是通过OS X的Terminal “浇灌”到 ...

  7. 牛客练习赛40 C-小A与欧拉路

    求图中最短的欧拉路.题解:因为是一棵树,因此当从某一个节点遍历其子树的时候,如果还没有遍历完整个树,一定还需要再回到这个节点再去遍历其它子树,因此除了从起点到终点之间的路,其它路都被走了两次,而我们要 ...

  8. ST3使用

    创建新的构建系统 Tools -> Build System -> New Build System... 输入类似的构建指令(首先清除当前的运行程序后再重新运行): { "sh ...

  9. Python9-递归函数-day17

    # 计算方法:人脑复杂,计算机简单#查找:找数据#排序#最短路径#我们学习的算法都是过去时#要了解基础的算法,才能创造出更好的算法#不是所有的事情都能套用现成的方法解决的# 有些时候会用到学过的算法只 ...

  10. BZOJ 4809: 皇后

    题目大意: n皇后问题,有些格子不能放. 题解: 直接暴力,并不用加优化就能过. 代码: #include<cstdio> using namespace std; int cc,n,an ...