【xsy2193】Wallace 最大权闭合子图
题目大意:给你一棵$n$个节点的树$a$,每个点有一个点权$val_i$,同时给你另一棵$n$个节点的树$b$。
现在你需要在树$a$上找一个联通块,满足这些点在树$b$上也是连通的,同时树$a$的这个联通块的点权和要最大。
数据范围:$n≤50$,$-1000≤val_i≤1000$。
我们考虑钦定一个点作为跟,不妨设当前钦定的根为$x$。
我们发现,如果要选择点$y$,那么由点$y$至$x$的路径上的点都需要选(无论是树$a$还是树$b$)
然后这个就变成了一个经典的最大权闭合子图问题
直接最小割判定即可。
时间复杂度:玄学
#include<bits/stdc++.h>
#define M 320
#define N 52
#define INF 19890604
using namespace std; struct edge{int u,v,next;}e[M]={}; int head[M]={},use=;
void add(int x,int y,int z){e[use].u=y;e[use].v=z;e[use].next=head[x];head[x]=use++;}
void Add(int x,int y,int z){add(x,y,z); add(y,x,);} int dis[N]={},S,T; queue<int> q; bool bfs(){
memset(dis,,sizeof(dis));
q.push(S); dis[S]=;
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=head[u];~i;i=e[i].next)
if(e[i].v&&dis[e[i].u]==){
dis[e[i].u]=dis[u]+;
q.push(e[i].u);
}
}
return dis[T];
} int dfs(int x,int flow){
if(x==T) return flow; int sum=;
for(int i=head[x];~i;i=e[i].next)
if(e[i].v&&dis[x]+==dis[e[i].u]){
int k=dfs(e[i].u,min(flow,e[i].v));
e[i].v-=k; e[i^].v+=k;
sum+=k; flow-=k;
if(flow==) return sum;
}
if(flow==) dis[x]=-;
return sum;
} int dinic(){int res=; while(bfs()) res+=dfs(S,<<); return res;} vector<int> G1[N],G2[N];
int val[N]={},f1[N]={},f2[N]={},n; void dfs(int x,int fa,vector<int> G[],int f[]){
f[x]=fa; if(fa) Add(x,fa,INF);
for(int i=;i<G[x].size();i++)
if(G[x][i]!=fa) dfs(G[x][i],x,G,f);
} int solve(int x){
memset(head,-,sizeof(head)); use=;
dfs(x,,G1,f1);
dfs(x,,G2,f2);
S=; T=n+;
for(int i=;i<=n;i++)
if(val[i]>) Add(S,i,val[i]);
else Add(i,T,-val[i]);
return dinic();
} int main(){
int sum=; scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",val+i),sum+=max(,val[i]);
for(int i=,x,y;i<n;i++) scanf("%d%d",&x,&y),x++,y++,G1[x].push_back(y),G1[y].push_back(x);
for(int i=,x,y;i<n;i++) scanf("%d%d",&x,&y),x++,y++,G2[x].push_back(y),G2[y].push_back(x); int maxn=;
for(int i=;i<=n;i++)
maxn=max(maxn,sum-solve(i));
cout<<maxn<<endl;
}
【xsy2193】Wallace 最大权闭合子图的更多相关文章
- BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...
- HDU 3879 Base Station(最大权闭合子图)
经典例题,好像说可以转化成maxflow(n,n+m),暂时只可以勉强理解maxflow(n+m,n+m)的做法. 题意:输入n个点,m条边的无向图.点权为负,边权为正,点权为代价,边权为获益,输出最 ...
- [BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以 ...
- HDU4971 A simple brute force problem.(强连通分量缩点 + 最大权闭合子图)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4971 Description There's a company with several ...
- HDU5855 Less Time, More profit(最大权闭合子图)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5855 Description The city planners plan to build ...
- HDU5772 String problem(最大权闭合子图)
题目..说了很多东西 官方题解是这么说的: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得分) 第二类:原串中的n个点每个 ...
- SCU3109 Space flight(最大权闭合子图)
嗯,裸的最大权闭合子图. #include<cstdio> #include<cstring> #include<queue> #include<algori ...
- hiho 第119周 最大权闭合子图
描述 周末,小Hi和小Ho所在的班级决定举行一些班级建设活动. 根据周内的调查结果,小Hi和小Ho一共列出了N项不同的活动(编号1..N),第i项活动能够产生a[i]的活跃值. 班级一共有M名学生(编 ...
- [HIHO119]网络流五·最大权闭合子图(最大流)
题目链接:http://hihocoder.com/contest/hiho119/problem/1 题意:中文题意. 由于1≤N≤200,1≤M≤200.最极端情况就是中间所有边都是满的,一共有N ...
随机推荐
- Explain结果解读与实践
MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...
- linux yum 本地源配置
1.查看硬盘情况 lsblk sr0就是光驱了 2.执行挂载命令 查看光驱cd /devls 执行命令 mount /dev/sr0 /mnt 将光驱挂载到 /mnt 目录 这样光驱就挂载好了 2. ...
- (14)Why some people find exercise harder than others
https://www.ted.com/talks/emily_balcetis_why_some_people_find_exercise_harder_than_others/transcript ...
- 下载编译安装Apache HTTP Server 2.4.23以及配置HTTP/HTTPS反向代理
http://blog.csdn.net/gangchengzhong/article/details/52910225 [注意,在编译make时出现的错误并不是文章中说的openssl的版本问题,而 ...
- mouseover和mouseout事件的相关元素
在发生mouseover和mouseout事件时,还会涉及更多的元素,这两个事件都会涉及把鼠标指针从一个元素的边界之内移动到另一个元素的边界之内.对mouseover事件而言,事件的主目标获得光标元素 ...
- 虚拟机CentOs的安装及大数据的环境搭建
大数据问题汇总 1.安装问题 1.安装步骤,详见文档<centos虚拟机安装指南> 2.vi编辑器使用问题,详见文档<linux常用命令.pd ...
- VIP之CVI CVO
3. VIP CVI CVO 在开始时,对于CVI和CVO是不知道应该怎样去调试的,就是不知道应该从哪里去确认是对还是错. 关于这一点从再次看到关于数据包的格式才明朗的.去分析CVI和输出 ...
- GPS 编程笔记
1.在GPS系统内,经纬度的显示方式一般都可以根据自己的爱好选择,一般有"hddd.ddddd"(度.度),"hddd*mm.mmm"(度.分. 分),&quo ...
- Linux远程批量工具mooon_ssh和mooon_upload使用示例
目录 目录 1 1. 前言 1 2. 批量执行命令工具:mooon_ssh 2 3. 批量上传文件工具:mooon_upload 2 4. 使用示例 3 4.1. 使用示例1:上传/etc/hosts ...
- python list 和 tuple, dict 用于迭代代价
#!/usr/bin/env python #-*- coding:utf-8 -*- import time start = time.time() for i in range(1000000): ...