正题

题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1325


题目大意

两棵树。要求选出一组权值和最大的点使得这两个点集在两棵树上都是连通的。


解题思路

我们枚举一个中间点iii,然后从这个点开始扩展连通块。那么如果这个点作为根的话,选择一个点之前就有选择它的父节点这个一个要求,然后用最大权闭合图求解即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=55,inf=2147483647/3;
struct node{int to,next,w;
};
int n,val[N],ans,s,t;
queue<int> q;
struct Net_Flow{node a[N*200];int tot,ls[N],dep[N];void init(){memset(ls,0,sizeof(ls));tot=1;}void addl(int x,int y,int w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;return;}bool bfs(){memset(dep,0,sizeof(dep));dep[s]=1;while(!q.empty())q.pop();q.push(s);while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[y]||!a[i].w)continue;dep[y]=dep[x]+1;if(y==t)return 1;q.push(y);}}return 0;}int dinic(int x,int flow){if(x==t)return flow;int rest=0,k;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[x]+1!=dep[y]||!a[i].w)continue;rest+=(k=dinic(y,min(a[i].w,flow-rest)));a[i].w-=k;a[i^1].w+=k;if(rest==flow)return flow;}if(!rest)dep[x]=0;return rest;}int get_ans(){int ans=0;while(bfs())ans+=dinic(s,inf);return ans;}
}nf;
struct Graph{node a[N*2];int tot,ls[N];void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;}void dfs(int x,int fa){for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;nf.addl(y,x,inf);dfs(y,x);}}
}G1,G2;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&val[i]); for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);x++;y++;G1.addl(x,y);G1.addl(y,x);}for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);x++;y++;G2.addl(x,y);G2.addl(y,x);}s=n+1;t=s+1;for(int i=1;i<=n;i++){nf.init();G1.dfs(i,i);G2.dfs(i,i);int sum=0;for(int i=1;i<=n;i++)if(val[i]>0)nf.addl(s,i,val[i]),sum+=val[i];else nf.addl(i,t,-val[i]);sum-=nf.get_ans();ans=max(ans,sum);}printf("%d",ans);
}

51nod1325-两棵树的问题【最大权闭合图,网络流】相关推荐

  1. 51nod1551-集合交易【hall定理,最大权闭合图,网络流】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1551 题目大意 nnn个集合,nnn个物品,每个集合有一些物品,一个价钱 ...

  2. 7-1 树的同构 (20分) 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右

    #include <bits/stdc++.h> using namespace std; struct tree{char data;int left,right; }; struct ...

  3. LeetCode——Same Tree(判断两棵树是否相同)

    问题: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...

  4. C语言高墙高,院子里有两棵树。因为有高墙庇护,一棵树长得高大挺直。而另一棵...

    院子里有两棵树.因为有高墙庇护,一棵树长得高大挺直.而另一棵树就不一样,因为要去承受风雨的袭击,它不得不随风生存,树干也就歪曲斑驳. 相关句子 2.那样,等它的根扎下后,树就长得歪曲,不会挺直. 3. ...

  5. LeetCode-判断两棵树是否相同

    两颗树的情况可能如下图所示: 1 1/ \ / \2 3 2 31 1/ \ / \2 1 1 2 求解思路:1.先判断两棵树是否为空,如果均为空,那么两棵树肯定相同:如果有一个为空,则不同. 2.在 ...

  6. 类C语言--树习题:判别两棵树是否相等。

    此代码可以运行,下附有运行区 [题目分析]先判断当前节点是否相等(需要处理为空.是否都为空.是否相等),如果当前节点不相等,直接返回两棵树不相等;如果当前节点相等,那么就递归的判断他们的左右孩子是否相 ...

  7. 检查两棵树是否相同(力扣)图解、思路与实现

    给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 1先判断两棵树只要有一棵树不为空 那么就返回false: 2再判断两棵树都为空 那 ...

  8. 递归判断两棵树是否相同

    递归写法判断两棵树是否相同: bool flag = true; // 默认认为两棵树是相同的,递归判断过程中改变flag值,一旦有一个不同,就跳出 void judge(node* root1, n ...

  9. 比较两棵树是否相同(关键词:树/二叉树/相同/相等/完全相同)

    比较两棵树是否相同 实现 def isSameTree(p, q):if p == None and q == None:return Trueelif p != None and q != None ...

最新文章

  1. (十一)java版spring cloud+spring boot+redis多租户社交电子商务平台- commonservice-sso服务搭建(一)...
  2. drools规则中调用其它规则_简化机器学习中的关联规则
  3. 园内ORM讨论的经典文章及评论[转]
  4. python操作mysql_使用Python操作MySQL的一些基本方法
  5. 深入Java -JVM 垃圾回收
  6. 在Kali上安装打印机
  7. 互联网产品跨部门沟通的10个原则(转)
  8. POJ 3984 迷宫问题
  9. ASP.NET Callback 回调实用讲解
  10. java 实体字段变更记录_java – Hibernate:检查哪个实体的字段被修改
  11. 搭建SSM框架的配置文件
  12. 《Python游戏趣味编程》标准IDE运行游戏代码的配置方法
  13. Weka--Explorer基本流程
  14. Hololens开发常见错误
  15. Go语言核心36讲(Go语言实战与应用十九)--学习笔记
  16. 如何优化我的世界服务器,我的世界服务器太卡怎么办 MC服务器优化攻略
  17. shell编程之正则表达式与文本处理器
  18. 软件测试:给你一个网站,你如何测试
  19. SpringBoot系列之Spring Data MongoDB教程
  20. python爬虫爬取实习僧岗位信息并存入excel数据表中

热门文章

  1. seo关键词互点软件报价_SEO关键词优化收费问题和外包报价问题,一文详解
  2. php curl https 443,PHP CURL支持HTTP、HTTPS 请求亲测可用
  3. ef 关联依赖属性_基础巩固之:xmlns属性梳理
  4. U盘安装Linux挂载cd,U盘安装Ubuntu Server CD-ROM挂载失败
  5. php 二维sort,php 二维数组排序
  6. cass小插件集合_插件|如何精准提取CASS方格网高程点?
  7. 云服务器下行_腾讯云轻量应用服务器简单测评
  8. 卡屏java_Java drawImage到屏幕上一卡一卡的
  9. 利用vector实现一对一(pair<int,int>)
  10. [Java基础]Junit测试