正题

题目链接:https://www.luogu.com.cn/problem/P2495


题目大意

nnn个点的一棵树,mmm次给出一些点,要求割掉最小权值的边使得这些点不和111号点联通。


解题思路

根据这些给出的点构造一棵虚树,然后直接dpdpdp求解即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=3e5+10,T=20,inf=1e18;
struct node{ll to,next,w;
}a[N*2];
ll n,m,tot,cnt,st,k,dep[N],dfn[N],ls[N],p[N];
ll f[N][T+1],g[N][T+1],pos[N],s[N],dp[N][2];
bool cmp(ll x,ll y)
{return dfn[x]<dfn[y];}
void addl(ll x,ll y,ll w){if(dep[x]>dep[y])swap(x,y);a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;return;
}
void dfs(ll x,ll fa){dfn[x]=++cnt;dep[x]=dep[fa]+1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa)continue;f[y][0]=x;g[y][0]=a[i].w;dfs(y,x);}return;
}
ll LCA(ll x,ll y){if(dep[x]>dep[y])swap(x,y);for(ll i=T;i>=0;i--)if(dep[f[y][i]]>=dep[x])y=f[y][i];if(x==y)return x;for(ll i=T;i>=0;i--)if(f[y][i]!=f[x][i])x=f[x][i],y=f[y][i];return f[x][0];
}
ll Dis(ll x,ll y){ll ans=inf;if(dep[x]>dep[y])swap(x,y);for(ll i=T;i>=0;i--)if(dep[f[y][i]]>=dep[x])ans=min(ans,g[y][i]),y=f[y][i];return ans;
}
void ins(ll x){if(!st){s[++st]=x;return;}ll lca=LCA(x,s[st]);while(st>1&&dep[s[st-1]]>dep[lca])addl(s[st-1],s[st],Dis(s[st-1],s[st])),st--;if(dep[s[st]]>dep[lca])addl(lca,s[st],Dis(lca,s[st])),st--;if((!st)||(lca!=s[st]))s[++st]=lca;s[++st]=x;return;
}
void solve(ll x){if(pos[x])dp[x][1]=0,dp[x][0]=inf;else dp[x][0]=0,dp[x][1]=0;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;solve(y);dp[x][0]+=min(dp[y][0],dp[y][1]+a[i].w);dp[x][1]=min(dp[x][0]+dp[y][1],min(dp[x][1]+dp[y][0],dp[x][1]+dp[y][1]));}ls[x]=pos[x]=0;return;
}
int main()
{scanf("%lld",&n);for(ll i=1;i<n;i++){ll x,y,w;scanf("%lld%lld%lld",&x,&y,&w);addl(x,y,w);addl(y,x,w);}memset(g,0x3f,sizeof(g));dfs(1,0);for(ll j=1;j<=T;j++)for(ll i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1],g[i][j]=min(g[i][j-1],g[f[i][j-1]][j-1]);memset(ls,0,sizeof(ls));scanf("%lld",&m);while(m--){scanf("%lld",&k);st=tot=0;for(ll i=1;i<=k;i++){scanf("%lld",&p[i]);pos[p[i]]=1;}sort(p+1,p+1+k,cmp);s[++st]=1;for(ll i=1;i<=k;i++)ins(p[i]);while(st>1)addl(s[st-1],s[st],Dis(s[st-1],s[st])),st--;solve(1);printf("%lld\n",dp[1][0]);}return 0;
}

P2495-[SDOI2011]消耗战【虚树,dp】相关推荐

  1. P2495 [SDOI2011]消耗战-虚树+树形dp

    https://www.luogu.com.cn/problem/P2495 虚树:当我们在解决树形dp的问题的时候,题目中会给出一些询问,询问涉及的关键节点不多,并保证总的点数规模的时候,我们就可以 ...

  2. 洛谷 P2495 [SDOI2011]消耗战 虚树

    题目描述 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望.已知 ...

  3. P2495 [SDOI2011]消耗战 虚树入门

    一棵树,n个点m个操作.每条边有权值,每个操作给你k个点,问断开若干条边后使k个点与根不相连的最小边权和是多少. 有sigmaK<500000 易知一个裸的树dp需要复杂度,m次操作后总复杂度为 ...

  4. P2495 [SDOI2011]消耗战(树形dp+虚树)

    P2495 [SDOI2011]消耗战 树形dp 状态表示:fuf_ufu​表示以uuu为根的子树中,uuu节点与子树中的关键的"隔开"所需要的最小代价 状态转移: 考虑uuu的一 ...

  5. 「Luogu2495」 [SDOI2011]消耗战 虚树

    Luogu P2495 [SDOI2011]消耗战 problem Solution 苦思冥想稍作思考之后可以得到一个树形DP的方法: 令\(w(u,v)\)表示u,v之间的边的权值,\(f[u]\) ...

  6. 洛谷_2495 [SDOI2011]消耗战(虚树)

    消耗战 题目链接:https://www.luogu.com.cn/problem/P2495 题解: 对于单样例,可以考虑树形DP. 但此题是多实例,所以需要对树进行处理,每次询问有k+1(加上一号 ...

  7. P2495 [SDOI2011]消耗战

    P2495 [SDOI2011]消耗战 虚树+dpdpdp. 每次在整个图上跑dpdpdp时间肯定不够,所以考虑只对查询点和其lcalcalca进行建图. 此题的dpdpdp转移有两种方式:一种是直接 ...

  8. 洛谷P2495 [SDOI2011]消耗战(虚树dp)

    P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...

  9. 虚树——P2495 [SDOI2011]消耗战

    好久没有学习新的知识了. https://www.luogu.com.cn/problem/P2495 今天我学习了一下虚树. 虚树就是一个不存在的树.用来简化问题.它只包括一些关键点和他的LCA 我 ...

  10. 洛谷P2495 [SDOI2011]消耗战 | 一个典型的可以搞懂虚树的例题

    题目链接 题目大意: 给出一棵树,之后对这棵树进行q次询问,每次询问一个点集,给出使得这些点集中的点都不能直接或者间接的与1相连,需要删边的最小代价(边的代价在给树的时候给出),,点集不包含1,点集总 ...

最新文章

  1. 958毕业,苦学Java,竟被二本毕业生吊打!网友:确实厉害!
  2. python 难度-Python分析 oj 网的题目难度和通过率的关系
  3. C++ Primer 5th笔记(chap 17 标准库特殊设施)正则表达式错误
  4. PHP CLI应用的调试原理
  5. net-speeder
  6. 前端学习(2587):权限控制的分类和意义
  7. 活动推荐|互联网3.0与区块链新时代论坛(北京)
  8. S3C6410处理器介绍
  9. Youki的笔记本重装系统的方法~
  10. Apache Flume 简介
  11. pip 换清华源 更新所有库 windows
  12. I2S原理分析(二十九)
  13. 2021年危险化学品经营单位安全管理人员实操考试视频及危险化学品经营单位安全管理人员操作证考试
  14. java计算机毕业设计高校贫困生信息管理系统源码+mysql数据库+系统+lw文档+部署
  15. mysql 数据恢复 (.ibdata1, bin log)
  16. Win10桌面背景消失了变黑的解决方法
  17. 装完系统还要装什么_一键重装系统后需要干嘛
  18. python+大数据之数据可视化完整版
  19. 数据结构与算法题目集7-32——哥尼斯堡的“七桥问题”
  20. JavaEE1(4/23)

热门文章

  1. windows挂载ext4_使用 UEFI 双启动 Windows 和 Linux | Linux 中国
  2. ibatise 没有大于等于吗_库里+杜兰特并没有大于等于2!或许他和库里搭配将更强...
  3. linux中的ip地址范围,linux – ip地址范围参数
  4. python随机数生成验证码_Python随机数random模块学习,并实现生成6位验证码
  5. html怎么防止表单重复提交,js防止表单重复提交的解决方法
  6. 未发现android设备,Brother iPrintScan 应用程序上出现错误信息“未发现支持设备”(Android™ 智能手机)。...
  7. leetcode459. 重复的子字符串(KMP)
  8. [Swagger2]SpringBoot集成Swagger
  9. 《C++ Primer》10.1节练习
  10. [蓝桥杯2016决赛]七星填数-next_permutation枚举