CF 103E Buying Sets 最大权闭合子图,匹配 难度:4
http://codeforces.com/problemset/problem/103/E
这道题首先一看就很像是最大权闭合子图,但是我们可以认为现在有两种点,数字和集合点,我们需要消除数字点的影响才能直接运用最大权闭合子图.
进行二分匹配,使得每个集合都唯一匹配一个数字,买下一个集合点,则意味着该集合中所有数字的对应匹配集合点都要被买下,也就是可以建立一个新图,其中某个集合点向对应数字代表的集合点连单向边,可以证明对于任意权闭合子图中的集合点,集合中所有数字的对应匹配集合点都已经在这个权闭合子图中.对这个新图的所有价格取反,答案即最大权的负数
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int maxn=305;
- const int maxm=2*maxn+maxn*maxn;
- const int sups=303,supt=304;
- const int inf=0x6ffffff;
- int n;//original aspects
- int price[maxn];
- int st[maxn][maxn],nst[maxn];
- int mch[2*maxn];//Match
- bool vis[2*maxn];
- int first[maxn],elen;//maximum flow
- struct edge{
- int nxt,f,t,c;
- }e[maxm];
- int dis[maxn],gap[maxn];
- bool subMatch(int s){
- vis[s]=true;
- for(int j=0;j<nst[s];j++){
- int t=st[s][j]+n;
- if(vis[t]||mch[t]==s)continue;
- if(mch[t]==0||(!vis[mch[t]]&&subMatch(mch[t]))){
- mch[t]=s;
- mch[s]=t;
- return true;
- }
- }
- return false;
- }
- void Match(){
- for(int i=1;i<=n;i++){
- if(mch[i]==0){
- memset(vis,false,sizeof(vis));
- subMatch(i);
- }
- }
- }
- void addedge(int f,int t,int c){
- e[elen].nxt=first[f];
- e[elen].f=f;
- e[elen].t=t;
- e[elen].c=c;
- first[f]=elen++;
- }
- void build(){
- for(int i=1;i<=n;i++){
- if(price[i]>=0){
- addedge(sups,i,price[i]);
- addedge(i,sups,0);
- }
- else {
- addedge(i,supt,-price[i]);
- addedge(supt,i,0);
- }
- for(int j=0;j<nst[i];j++){
- int t=mch[st[i][j]+n];
- addedge(i,t,inf);
- addedge(t,i,0);
- }
- }
- }
- int dfs(int s,int flow){
- if(s==supt)return flow;
- int mindis=n;
- int tflow=flow,sub;
- for(int p=first[s];p!=-1;p=e[p].nxt){
- int t=e[p].t;
- if(e[p].c>0){
- if(dis[t]+1==dis[s]){
- sub=dfs(t,min(tflow,e[p].c));
- e[p].c-=sub;e[p^1].c+=sub;
- tflow-=sub;
- if(dis[sups]>n)return flow-tflow;
- if(tflow<=0)break;
- }
- mindis=min(mindis,dis[t]);
- }
- }
- if(flow==tflow){
- --gap[dis[s]];
- if(gap[dis[s]]==0)dis[sups]=n+1;
- else{
- dis[s]=mindis+1;
- ++gap[dis[s]];
- }
- }
- return flow-tflow;
- }
- int maxflow(){
- int flow=0;
- gap[0]=n+2;
- while(dis[sups]<=n){
- flow+=dfs(sups,inf);
- }
- return flow;
- }
- int main(){
- int ans=0;
- memset(first,-1,sizeof(first));
- scanf("%d",&n);
- for(int i=1;i<=n;i++){
- scanf("%d",nst+i);
- for(int j=0;j<nst[i];j++){
- scanf("%d",st[i]+j);
- }
- }
- for(int i=1;i<=n;i++){
- scanf("%d",price+i);
- price[i]*=-1;
- if(price[i]>=0)ans+=price[i];
- }
- Match();
- build();
- ans=maxflow()-ans;
- printf("%d\n",ans);
- return 0;
- }
CF 103E Buying Sets 最大权闭合子图,匹配 难度:4的更多相关文章
- 洛谷 P4174 [NOI2006]最大获利 && 洛谷 P2762 太空飞行计划问题 (最大权闭合子图 && 最小割输出任意一组方案)
https://www.luogu.org/problemnew/show/P4174 最大权闭合子图的模板 每个通讯站建一个点,点权为-Pi:每个用户建一个点,点权为Ci,分别向Ai和Bi对应的点连 ...
- Solution -「最大权闭合子图」做题随笔
T1 小 M 的作物 先从简化题目入手,考虑先去掉 \(c\) 的额外收益.然后尝试将所有作物种在 \(B\), 则目前得到了 \(\sum \limits_{i = 1} ^n b_i\) 的收益. ...
- 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 ...
随机推荐
- poj1319Pipe Fitters
链接 算不上几何的水题 第一种为(int)a*(int)b: 第二种分宽高交换两种讨论. 每一个的高度除第一个为1外其它的都可以看着b/sqrt(3.0)/2; #include <iostre ...
- Python学习(6)循环语句
目录 Python循环语句 - while循环语句 -- 无线循环 -- 循环使用else语句 -- 简单语句组 - for循环语句 -- 通过序列索引迭代 -- 循环使用else语句 - 循环嵌套 ...
- Android Volley和Gson实现网络数据加载
Android Volley和Gson实现网络数据加载 先看接口 1 升级接口 http://s.meibeike.com/mcloud/ota/cloudService POST请求 参数列表如下 ...
- Nginx基本配置备忘
原文:http://www.open-open.com/lib/view/open1482477873078.html Nginx 配置 在了解具体的Nginx配置项之前我们需要对于Nginx配置文件 ...
- OpenGL的几何变换3之内观察全景图
继续上一篇文章的例子:OpenGL的几何变换2之内观察立方体 上一篇是通过绘图方式得到的立方体,没有贴图,这次加上纹理贴图. 通过纹理贴图有两种方案: 1.图片分割化,即是把一张完整的全景图片(就是支 ...
- CSS3学习笔记之属性值
font-family 设置文本的字体名称. font-style 设置文本样式. 取值 normal不使用斜体. italic使用斜体. oblique使用倾斜体. inherit从父元素继承. f ...
- jquery 设置checked="checked"无效,radio未选中。。
jquery 设置checked="checked"无效,radio未选中.. 最好还是使用.prop(),在jQuery1.6版本之前.attr存在一些bug.在1.6之后它会自 ...
- 实战微信JS SDK开发:贺卡制作与播放(2)
最近同事用CanTK开发了一个基于微信的贺卡制作APP,我虽然没有参与开发,但是提供CanTK和GameBuilder的技术支持,觉得有些东西比较有意思,写几篇博客和大家分享吧.这个贺卡APP完全开源 ...
- IOC Container(服务容器)的工作机制
IOC Container 是laravel的一个核心内容,有了IOC Container在Laravel的强大表现,我们可以在Laravel中实现很大程度的代码维护性.(文档我是看的懵逼懵逼的(*^ ...
- echarts折线图--数据交互
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...