最大权闭合图hdu3996

定义:最大权闭合图:是有向图的一个点集,且该点集的所有出边都指向该集合。即闭合图内任意点的集合也在改闭合图内,给每个点分配一个点权值Pu,最大权闭合图就是使闭合图的点权之和最大。


最小割建边方式:源点s和正权的点连接,容量是Pu,负权的点和汇点t相连,容量是-Pu,之间的边权值inf,过一遍最大流ans,正权之和sum-ans就是最大权闭合图的值。

例题:HDU3996

题意:给出n个金矿地区,每个金矿地区有mi个矿坑,挖取第i个地区的第j个矿坑需要花费cost[i][j],可以获得利益value[i][j],但是有些限制条件,就是想要挖取第i个地区的第j个矿坑之前必须把第ii个地区的第jj个矿坑挖掉.问最大获益是多少?

分析:共用n*Mi个矿坑,每个点的权值是value[i][j]-cost[i][j],建边从第i,j指向ii,jj,表示要选取i,j一定会选取ii,jj。建边后跑一遍Dinic即可。

#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"algorithm"
#include"math.h"
#include"vector"
#include"queue"
#define M 3009
#define inf 1000000000000000LL
#define eps 1e-7
#define pps 1e-18
#define PI acos(-1.0)
#define LL __int64
using namespace std;
struct node
{int u,v,next;LL w;
}edge[M*300];
int t,head[M],dis[M];
int lay[M],num[111][30],work[M];
LL p[M],cost[M];
LL min(LL a,LL b)
{return a<b?a:b;
}
void init()
{t=0;memset(head,-1,sizeof(head));
}
void add(int u,int v,LL w)
{edge[t].u=u;edge[t].v=v;edge[t].w=w;edge[t].next=head[u];head[u]=t++;edge[t].u=v;edge[t].v=u;edge[t].w=0;edge[t].next=head[v];head[v]=t++;
}
int bfs(int S,int T)
{queue<int>q;memset(dis,-1,sizeof(dis));q.push(S);dis[S]=0;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].v;if(edge[i].w&&dis[v]==-1){dis[v]=dis[u]+1;if(v==T)return 1;q.push(v);}}}return 0;
}
LL dfs(int cur,LL a,int T)
{if(cur==T)return a;for(int &i=work[cur];~i;i=edge[i].next){int v=edge[i].v;if(edge[i].w&&dis[v]==dis[cur]+1){LL tt=dfs(v,min(a,edge[i].w),T);if(tt){edge[i].w-=tt;edge[i^1].w+=tt;return tt;}}}return 0;
}
LL Dinic(int S,int T)
{LL ans=0;while(bfs(S,T)){memcpy(work,head,sizeof(head));while(LL tt=dfs(S,inf,T))ans+=tt;}return ans;
}
struct st
{int u,v;st(int uu,int vv){u=uu;v=vv;}
};
vector<st>s[M];
int main()
{int Case,n,i,j,k,K,ii,jj,kk=1;scanf("%d",&Case);while(Case--){scanf("%d",&n);for(i=1;i<M;i++)s[i].clear();int cnt=0;init();for(i=1;i<=n;i++){scanf("%d",&lay[i]);for(j=1;j<=lay[i];j++){num[i][j]=++cnt;scanf("%I64d%I64d%d",&cost[cnt],&p[cnt],&K);for(k=1;k<=K;k++){scanf("%d%d",&ii,&jj);s[cnt].push_back(st(ii,jj));}}}init();for(i=1;i<=n;i++){for(j=1;j<=lay[i];j++){for(k=0;k<(int)s[num[i][j]].size();k++){int ii=s[num[i][j]][k].u;int jj=s[num[i][j]][k].v;add(num[i][j],num[ii][jj],inf);}}}LL sum=0;for(i=1;i<=cnt;i++){if(p[i]-cost[i]>0){add(0,i,p[i]-cost[i]);sum+=p[i]-cost[i];}else if(p[i]-cost[i]<0)add(i,cnt+1,cost[i]-p[i]);}LL ans=Dinic(0,cnt+1);printf("Case #%d: ",kk++);printf("%d\n",sum-ans);}return 0;
}


转载于:https://www.cnblogs.com/mypsq/p/4348097.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非监督学习的单层网络分析

这篇博客对应的是Andrew.Ng的那篇文章&#xff1a;An Analysis o f Single-Layer Networks in Unsupervised Feature Learning&#xff0c;文章的主要目的是讨论receptive field size&#xff0c;number of hidden nodes&#xff0c; step-stride以及whitening在对卷积网络模型…

poj3009 Curling 2.0 深搜

PS&#xff1a;以前看到题目这么长就没写下去了。今天做了半天&#xff0c;没做出来。准备看题解&#xff0c;打开了网站都忍住了&#xff0c;最后还是靠自己做出来的。算是一点进步吧。 分析&#xff1a; 题目的意思没明白或者理解有偏差都没办法做题。看样例3和样例4&#xf…

iOS iphone屏幕分析(岂止而大)

在写本文前&#xff0c;我必须介绍几点内容&#xff1a;第一点&#xff1a;屏幕上面显示的内容多少和屏幕的尺寸大小无关第二点&#xff1a;屏幕上面显示的内容多少和分辨率完全无关第三点&#xff1a;屏幕上面显示的内容多少和屏幕尺寸、屏幕分辨率、PPI等都是无关的那到底什么…

【随笔】Win7下GVIM的安装与配置

针对各种语言的编辑器千千万万&#xff0c;最好的就是最适合自己的&#xff0c;这句话一点没错。 偶然间&#xff0c;需要在Windows上编写代码&#xff0c;MyEclipse等太大&#xff0c;完全没有必要&#xff0c;所以就想起来了vim这个神器。个子小&#xff0c;功能强&#xff0…

[java] 虚拟机(JVM)底层结构详解[转]

[java] 虚拟机(JVM)底层结构详解[转] 本文来自&#xff1a;曹胜欢博客专栏。转载请注明出处&#xff1a;http://blog.csdn.net/csh624366188 在以前的博客里面&#xff0c;我们介绍了在java领域中大部分的知识点&#xff0c;从最基础的java最基本语法到SSH框架。这里面应该包含…

用计算器计算“异或CRC”

再计算器上输入以下数字&#xff0c;每输入一个数字&#xff0c;按一下“Xor” 转载于:https://www.cnblogs.com/YangBinChina/p/4164513.html

程序猿是如何解决SQLServer占CPU100%的

文章目录 遇到的问题使用SQLServer Profiler监控数据库 SQL1&#xff1a;查找最新的30条告警事件SQL2&#xff1a;获取当前的总报警记录数有哪些SQL语句会导致CPU过高&#xff1f;查看SQL的查询计划 选择top记录时&#xff0c;尽量为order子句的字段建立索引查看SQL语句CPU高的…

基于纤程(Fiber)实现C++异步编程库(一):原理及示例

纤程&#xff08;Fiber&#xff09;和协程&#xff08;coroutine&#xff09;是差不多的概念&#xff0c;也叫做用户级线程或者轻线程之类的。Windows系统提供了一组API用户创建和使用纤程&#xff0c;本文中的库就是基于这组API实现的&#xff0c;所以无法跨平台使用&#xff…

C语言 将整数写入内存指定的连续字节单元中

将整数数组写入0x40003000开始的连续10个字节内存单元中&#xff0c;注意unsigned char *指向一个字节&#xff0c;而int *指向1个字&#xff08;4个字&#xff09;&#xff0c;但是可以把字中存储的整数放入字节单元中&#xff0c;只要不超过表示的范围&#xff0c;注意虽然un…

多项目开发下的dll文件管理

阅读目录&#xff1a;DS01&#xff1a;为什么要对生成的dll文件进行管理&#xff1f;DS02&#xff1a;首先介绍以下两个DOS命令DS03&#xff1a;第一种实现方法&#xff08;xcopy&#xff09;DS04&#xff1a;第二种实现方法&#xff08;attrib&#xff09;DS05&#xff1a;分享…

自然连接(NATURAL JOIN)

自然连接&#xff08;NATURAL JOIN&#xff09;是一种特殊的等价连接&#xff0c;它将表中具有相同名称的列自动进行记录匹配。自然连接不必指定任何同等连接条件。图9.9给出了典型的自然连接示意图。 图9.9 自然连接 自然连接自动判断相同名称的列&#xff0c;而后形成匹配。…

自连接

9.3 表的连接类型 9.3.1 自连接 自连接是指表与其自身进行连接&#xff0c;这就需要用到前面介绍的表别名。下面通过一个具体实例来讲解自连接的应用。 实例5 自连接的使用方法 查询成绩中存在不及格课程的学生的姓名、所在系、所有的课程及成绩信息。如果采用前面介绍的…

LIKE运算符

6.5 使用LIKE进行模糊查询 当只知道部分字符串时&#xff0c;可使用LIKE运算符来查询数据库&#xff0c;找出与其相关的整个字符串。因此&#xff0c;当把关键字LIKE用在WHERE子句中时&#xff0c;可以比较两个字符串的部分匹配。当对字符串内容有些印象&#xff0c;但并不知…

AND运算符

6.2 组合查询条件 在前一章提到的WHERE子句进行查询时&#xff0c;WHERE子句后面的搜索条件只是单一的。实际上&#xff0c;可以通过布尔运算符AND和OR&#xff0c;将多个单独的搜索条件结合在一个WHERE子句中&#xff0c;形成一个复合的搜索条件。当对复合搜索条件求值时&a…

OR运算符

6.2.2 OR运算符 OR运算符表示“或”的关系。当可能有多个条件为True&#xff0c;但只要有一个为True就满足搜索要求时&#xff0c;可以使用OR运算符来组合搜索条件。OR在结合两个布尔表达式时&#xff0c;只要其中一个条件为True时&#xff0c;便传回True。OR运算符的真值表…

Java基础---网络编程

第一讲 概述 1、网络模型&#xff1a;OSI参考模型和TCP/IP参考模型 图示&#xff1a; 一般来说开发处于传输层和网际层&#xff0c;应用层为&#xff1a;FTP和HTTP协议等&#xff0c;传输层为&#xff1a;UDP和TCP等&#xff0c;网际层为&#xff1a;IP。 通常用户操作的是…

AND、OR运算符的组合使用

6.2.3 AND、OR运算符的组合使用 在WHERE子句中&#xff0c;通过AND、OR运算符可以同时连接多个条件&#xff0c;当然AND、OR运算符也可以同时使用。但是当AND、OR运算符同时存在时&#xff0c;其优先级如何确定呢&#xff1f;与大多数语言一样&#xff0c;SQL语言认为AND运算…

IN运算符的使用

6.3 IN运算符 在查询中&#xff0c;有时只要满足多个条件中的一个条件即可&#xff0c;如查询地址在北京、上海或者重庆的学生信息&#xff0c;这时候可以使用IN运算符。 6.3.1 IN运算符的使用 IN运算符允许根据一行记录中&#xff0c;是否有一列包括在一系列值之中&#…

NOT运算符与运算符

6.4.2 NOT运算符与<>运算符 对于简单的条件查询&#xff0c;NOT运算符与<>运算符的功能几乎没有什么区别&#xff0c;那么NOT运算符的优势体现在哪里呢&#xff1f;答案是它可以与其他运算符组合使用&#xff0c;这一点是<>运算符所不能实现的。在6.4.1节已…

“%”通配符

6.5.2 “%”通配符 在SQL语言中最常用的通配符可能就是“%”了&#xff0c;它表示任意字符的匹配&#xff0c;且不计字符的多少。下面通过几个典型实例来说明“%”通配符的使用。 1&#xff0e;开头&#xff0f;结尾匹配 从COURSE表中查询所有以“计算机”开头的所有课程的…