【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 ...
随机推荐
- windows下解决端口被占用的问题
步骤一.Windows查看所有的端口 点击电脑左下角的开始,然后选择运行选项,接着我们在弹出的窗口中,输入[cmd]命令,进行命令提示符.然后我们在窗口中输入[netstat -ano]按下回车,即会 ...
- 微信小程序toast框的使用
1.wx.showToast() 方法可以配置toast框的提示文字,消失的时间,显示的图标 wx.showToast({ title: '请链接网络', icon:"none", ...
- Codeforces Round #524 (Div. 2) F. Katya and Segments Sets(主席树)
https://codeforces.com/contest/1080/problem/F 题意 有k个区间,区间的种类有n种,有m个询问(n,m<=1e5,k<=3e5),每次询问a,b ...
- idea创建maven项目报错,Error initializing: org.codehaus.plexus.velocity.DefaultVelocityComponent@56da52a7 java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
学着使用idea,想创建个maven项目,但是出师不利,立马报错,贼尴尬,错误信息如下: D:\Develop\JDK\bin\java.exe -Dmaven.multiModuleProjectD ...
- day26(分页查询)
分页查询思路 问题: 服务器向浏览器想用数据很多的时候可以对数据进行封装. domain层 封装数据 package com.baidu.domain; import java.util.List; ...
- java基础-day30
第07天 MySQL数据库 今日内容介绍 u 多表关系实战练习 u 多表查询 u SQL语句的练习 第1章 多表关系实战练习 1.1 多表关系--实战1--省和市 1.1.1 需求分析 在数据库 ...
- 修改Android EditText光标颜色
EditText有一个属性:android:textCursorDrawable,这个属性是用来控制光标颜色的 android:textCursorDrawable="@null&quo ...
- vue.js入门学习
可以用淘宝npm镜像 然后安装 然后初始化项目: Watch就是一个监听 v-if是如果为false就根本不在页面存在这个元素 v-show是通过display:none来控制这个元素的显示和隐藏 r ...
- POJ1446 Girls and Boys
Girls and Boys Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 12747 Accepted: 5678 D ...
- Ajax_Json
前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AjaxJson ...