2286: [Sdoi2011]消耗战

链接

分析

  虚树练习题。

  构建虚树,在虚树上DP。

  

  跟着gxb学虚-tree。。。

代码

 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#include <cctype> using namespace std; const int N = ;
const int INF = 1e9; int head[N<<],nxt[N<<],to[N<<],w[N<<],TotE;
int deth[N],val[N],siz[N],dfn[N],fa[N],son[N],bel[N],sk[N<<],top,Time_index;
int A[N]; inline int read() {
int x = ,f = ;char ch =getchar();
for (; !isdigit(ch); ch=getchar()) if (ch=='-') f=-;
for (; isdigit(ch); ch=getchar()) x = x*+ch-'';
return x * f;
}
bool cmp(const int &a,const int &b) {
return dfn[a] < dfn[b];
}
void Add_edge(int u,int v,int c) {
++TotE;to[TotE] = v;w[TotE] = c;nxt[TotE] = head[u];head[u] = TotE;
++TotE;to[TotE] = u;w[TotE] = c;nxt[TotE] = head[v];head[v] = TotE;
}
void add_edge(int u,int v) {
++TotE;to[TotE] = v;nxt[TotE] = head[u];head[u] = TotE;
}
void dfs1(int u,int mn) {
val[u] = mn;
siz[u] = ;
for (int i=head[u]; i; i=nxt[i]) {
int v = to[i];
if (v==fa[u]) continue;
fa[v] = u;
deth[v] = deth[u] + ;
dfs1(v,min(w[i],mn));
siz[u] += siz[v];
if (!son[u] || siz[v] > siz[son[u]]) son[u] = v;
}
}
void dfs2(int u,int top) {
bel[u] = top;
dfn[u] = ++Time_index;
if (!son[u]) return;
dfs2(son[u],top);
for (int i=head[u]; i; i=nxt[i]) {
int v = to[i];
if (v==fa[u] || v==son[u]) continue;
dfs2(v,v);
}
}
int Lca(int u,int v) {
while (bel[u] != bel[v]) {
if (deth[bel[u]] < deth[bel[v]]) swap(u,v);
u = fa[bel[u]];
}
if (deth[u] < deth[v]) return u;
return v;
}
void Insert(int p) {
int x = sk[top];
if (x==) {sk[++top] = p;return ;}
int lca = Lca(p,x);
if (lca == x) return; // 此题构建虚树不同的是,若x==lca,不加入p。
while (lca != x) {
int y = sk[--top];
if (dfn[y] < dfn[lca]) {
add_edge(lca,x);
sk[++top] = lca;
break;
}
add_edge(y,x);
x = sk[top];
}
sk[++top] = p;
}
long long DP(int u) {
if (!head[u]) return val[u];
long long ans = ;
for (int i=head[u]; i; i=nxt[i]) ans += DP(to[i]);
head[u] = ;
return min(ans,(long long)val[u]);
}
int main() {
int n = read();
for (int i=; i<n; ++i) {
int u = read(),v = read(),w = read();
Add_edge(u,v,w);
}
deth[] = ;
dfs1(,INF);
dfs2(,);
TotE = ;
memset(head,,sizeof(head)); int m = read();
while (m--) {
TotE = ;sk[top = ] = ; int k = read();
for (int i=; i<=k; ++i) A[i] = read();
sort(A+,A+k+,cmp);
for (int i=; i<=k; ++i) Insert(A[i]);
while (--top) add_edge(sk[top],sk[top+]); long long ans = ;
for (int i=head[]; i; i=nxt[i]) ans += DP(to[i]); // 单独处理1的情况,否则val[1]设为很大的longlong数,INF不够。
printf("%lld\n",ans);
head[] = ;
}
return ;
}

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

  1. BZOJ 2286: [Sdoi2011]消耗战

    2286: [Sdoi2011消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2082  Solved: 736[Submit][Status] ...

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

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

  3. 【BZOJ】2286: [Sdoi2011消耗战

    http://www.lydsy.com/JudgeOnline/problem.php?id=2286 题意:n个点的边加权树,m个询问,每次询问给出的k个点与结点1分离的最小代价.(n<=2 ...

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

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

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

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

  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. python网络编程-paramiko模块

    paramiko模块 该模块基于SSH用于连接远程服务器并执行相关操作 参考文档 SSHClient 用于连接远程服务器并执行命令 import paramiko #创建SSH对象 ssh = par ...

  2. 从PeopleEditor控件中取出多用户并更新到列表

    如果一个列表中有一个字段类型为用户或用户组,并且设置为用户,允许多值的话,那么用代码进行更新的时候就必须将这个字段的值赋成SPFieldUserValueCollection类型,以下代码即为从Peo ...

  3. UDoc(云平台企业应用级 文档管理产品)

    类型: 定制服务 软件包: integrated industry solution collateral 联系服务商 产品详情 解决方案 概要 为企业提供基于云平台企业应用级文档管理产品,尽可能最大 ...

  4. php的yii框架开发总结1

    最近用php的yii框架写了一个小的demo,虽然不复杂,但是也学习了很多东西,现在总结一下. 项目需求:为几个教研室写一个日报系统,每个人每天写日报,并且系统有自动实现发邮件功能. 额外要求:1.人 ...

  5. 使用md5的密码加密,处理用户的密码

    需求 1.新增用户保存:使用md5的密码加密,如果用户没有填写密码,设置初始密码“123”: 2.修改用户保存:使用md5的加密加密 *如果修改了密码,需要进行md5的密码加密: *如果没有修改密码, ...

  6. 如何C#操作SQLite数据库

    或许有人之前在java开发中使用过SQLite,对它有些印象.在用Winform或Wpf开发小应用程序时,发现用SQLite数据库也是不错的.就像一个会员管理软件,开发完毕后,可以省去想sqlserv ...

  7. 2017.10.28 QB模拟赛 —— 上午

    题目链接 T1 1e18 内的立方数有 1e6个 直接枚举可过 二分最优 考场用set  死慢.. #include <cstdio> int t; long long p; int ma ...

  8. 虚连接 tcp

    由TCP 建立的连接叫做虚连接(virtual connection),这是因为它们是由软件实现的,底层的系统并不对连接提供硬件或软件支持,只是两台机器上的TCP 软件模块通过交换消息来实现逻辑...

  9. 轻量级HTTP服务器Nginx(Nginx性能优化技巧)

    轻量级HTTP服务器Nginx(Nginx性能优化技巧)   文章来源于南非蚂蚁   一.编译安装过程优化 1.减小Nginx编译后的文件大小在编译Nginx时,默认以debug模式进行,而在debu ...

  10. 导航栏上的item的位置设置

    /** leftItem */ UIButton *leftbtn = [[UIButton alloc]initWithFrame:CGRectMake(, , , )]; [leftbtn set ...