hdu 2987最大权闭合图模板类型题
- /*
- 最大权闭合图模板类型的题,考验对知识概念的理解。
- 题意:如今要辞退一部分员工。辞退每个员工能够的到一部分利益(能够是负的),而且辞退员工,必须辞退他的下属。求最大利益和辞退的最小人数。
- 最大权闭合图模板类型。
- 求出最大权后沿着源点s,dfs到的点就为最小的人数。
- 证明/*
- 转载:利用一个经典的trick:多keyword
- > 建图前,对全部b[i],运行变换b[i]=b[i]*10000-1。然后。会惊异地发现,
- > 此时最大流所相应的方案就是满足辞退最少人数的了。
- > 为什么?显然,变换后的流量r2除以10000后再取整就等于原来的流量,可是
- > r2的后四位却蕴含了辞退人数的信息:每多辞退一个人,流量就会少1。
- >
- > 剩下的就是怎样依据一个网络流输出方案。
- > 我的做法:从源点開始沿着残余网络dfs(仅仅走没有满载的边),
- > 能dfs到的点相应的人就是须要辞退的。*/
- */
- #include"stdio.h"
- #include"string.h"
- #include"string"
- #include"queue"
- #define ll __int64
- #define N 9999
- #define inf 0x3fffffff
- using namespace std;
- struct node {
- ll u,v,w,next;
- }bian[N*50];
- ll fee[N];
- ll head[N],yong,s,t,dis[N];
- void init(){
- yong=0;
- memset(head,-1,sizeof(head));
- memset(dis,-1,sizeof(dis));
- }
- void addedge(ll u,ll v,ll w) {
- bian[yong].u=u;
- bian[yong].v=v;
- bian[yong].w=w;
- bian[yong].next=head[u];
- head[u]=yong++;
- }
- void add(ll u,ll v,ll w) {
- addedge(u,v,w);
- addedge(v,u,0);
- }
- void bfs() {
- ll u,v,i;
- queue<ll>q;
- q.push(t);
- dis[t]=0;
- while(!q.empty()) {
- u=q.front();
- q.pop();
- for(i=head[u];i!=-1;i=bian[i].next) {
- v=bian[i].v;
- if(dis[v]==-1) {
- dis[v]=dis[u]+1;
- q.push(v);
- }
- }
- }
- return ;
- }
- ll ISAP() {
- ll sum=0;
- bfs();
- ll gap[N],cur[N],stac[N],top,i;
- memset(gap,0,sizeof(gap));
- for(i=s;i<=t;i++) {
- gap[dis[i]]++;
- cur[i]=head[i];
- }
- ll k=s;
- top=0;
- while(dis[s]<t+1) {
- if(k==t) {
- ll minn=inf,index;
- for(i=0;i<top;i++) {
- ll e=stac[i];
- if(minn>bian[e].w) {
- minn=bian[e].w;
- index=i;
- }
- }
- for(i=0;i<top;i++) {
- ll e=stac[i];
- bian[e].w-=minn;
- bian[e^1].w+=minn;
- }
- sum+=minn;
- top=index;
- k=bian[stac[top]].u;
- }
- for(i=cur[k];i!=-1;i=bian[i].next) {
- ll v=bian[i].v;
- if(bian[i].w&&dis[k]==dis[v]+1) {
- cur[k]=i;
- k=v;
- stac[top++]=i;
- break;
- }
- }
- if(i==-1) {
- ll m=t+1;
- for(i=head[k];i!=-1;i=bian[i].next)
- if(m>dis[bian[i].v]&&bian[i].w) {
- m=dis[bian[i].v];
- cur[k]=i;
- }
- if(--gap[dis[k]]==0)break;
- gap[dis[k]=m+1]++;
- if(k!=s)
- k=bian[stac[--top]].u;
- }
- }
- return sum;
- }
- ll cou=0,vis[N];
- void dfs(ll u){//,ll pre) {会形成环越界
- ll i,j;
- cou++;
- vis[u]=1;
- for(i=head[u];i!=-1;i=bian[i].next) {
- j=bian[i].v;
- if(bian[i].w&&!vis[j]) {
- dfs(j);
- }
- }
- return ;
- }
- int main() {
- ll n,m,i,j,sum;
- while(scanf("%I64d%I64d",&n,&m)!=EOF) {
- init();
- s=0;t=n+1;sum=0;
- for(i=1;i<=n;i++) {
- scanf("%I64d",&fee[i]);
- if(fee[i]>0) {
- add(s,i,fee[i]);
- sum+=fee[i];
- }
- else
- add(i,t,-fee[i]);
- }
- while(m--) {
- scanf("%I64d%I64d",&i,&j);
- add(i,j,inf);
- }
- cou=0;
- sum=sum-ISAP();
- memset(vis,0,sizeof(vis));
- dfs(0);
- printf("%I64d %I64d\n",cou-1,sum);
- }
- return 0;
- }
hdu 2987最大权闭合图模板类型题的更多相关文章
- hdu 3879 最大权闭合图(裸题)
/* 裸的最大权闭合图 解:参见胡波涛的<最小割模型在信息学竞赛中的应用 #include<stdio.h> #include<string.h> #include< ...
- hdu 3879 hdu 3917 构造最大权闭合图 俩经典题
hdu3879 base station : 各一个无向图,点的权是负的,边的权是正的.自己建一个子图,使得获利最大. 一看,就感觉按最大密度子图的构想:选了边那么连接的俩端点必需选,于是就以边做点 ...
- poj 2987(最大权闭合图+割边最少)
题目链接:http://poj.org/problem?id=2987 思路:标准的最大权闭合图,构图:从源点s向每个正收益点连边,容量为收益:从每个负收益点向汇点t连边,容量为收益的相反数:对于i是 ...
- hdu 3061 hdu 3996 最大权闭合图 最后一斩
hdu 3061 Battle :一看就是明显的最大权闭合图了,水提......SB题也不说边数多少....因为开始时候数组开小了,WA....后来一气之下,开到100W,A了.. hdu3996. ...
- poj 2987 最大权闭合图
Language: Default Firing Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 8744 Accept ...
- hdu 3917 (最大权闭合图)
题意:政府有一些路,m个公司来修,每个公司修路要交税给政府,修路政府要付给公司费用,求政府能获得的最大利润,如果选择一个公司负责一个项目,那么该公司负责的其它项目也必须由他负责,并且与其有相连关系的公 ...
- hdu 3996 (最大权闭合图)
题意:有n个区域布局,每个区域有一些金矿,挖开金矿需要一定的费用,可以得到一定的利润,要想挖开一个金矿,必须挖开所有在这个金矿上边的金矿,求最大利益,给的数据价值太大,用64位. 分析:如果一个金矿可 ...
- hdu 3061 (最大权闭合图)
分析:城池之间有依赖关系,汇点与能获得兵力的城池连接,容量为可以获得的兵力,损耗兵力的城池与汇点连接容量为损耗的兵力,有依赖关系的城池间连边,容量为无穷大,跑网络流求出的最小割就是损耗的最小兵力,,, ...
- HDU 3917 最大权闭合图 求最小割
具体参考http://blog.csdn.net/power721/article/details/6665750 TODO //#pragma comment(linker, "/STAC ...
随机推荐
- Java 枚举常见7种用法
用法一:常量 在JDK1.5 之前,我们定义常量都是: publicstaticfianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. publ ...
- boa cgi程序cgi_header: unable to find LFLF
ftp必须用二进制模式上传才可以 sqlite3 arm-linux-gcc hello.c -o hello.cgi -I /cgi/include -L /cgi/lib -static -lsq ...
- BigDecimal类型数据保留两位小数即百分比运算
方法示例: DecimalFormat df = new DecimalFormat("0.00"); Object price = 2; Object price1 = 2.3; ...
- 用Latex写IEEE论文
如果在搞科研,想在IEEE上发表文章,那么就不得不用IEEE的论文模板,分为doc版本和Tex版本.Tex是高德纳·纳什所写,大牛级的任务,写过<计算机程序设计艺术>,曾经是美国最年轻的科 ...
- ThreadLocal实现session中用户信息 的线程间共享
转载自:http://blog.sina.com.cn/s/blog_4b5bc01101013gok.html ThreadLocal并不难理解,我总结的最简单的理解就是: ThreadLocal像 ...
- flex创建hashMap
1,定义hashMap的接口. import flash.events.IEventDispatcher; import mx.events.CollectionEvent; /** * Dispa ...
- Node.js:模块系统、函数
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块, ...
- 大端和小端(Big endian and Little endian)
一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它 ...
- SQL Server更改排序规则的实现过程
摘自: http://www.2cto.com/database/201112/115138.html 以下的文章主要向大家描述的是SQL Server更改排序规则的实现过程,以及在实现其实际操作过程 ...
- (C++)C++多态性中的静态绑定和动态绑定
静态绑定和动态绑定是C++多态性的一种特性. 1.对象的静态类型和动态类型: 对象的静态类型: 对象在声明是采用的类型,在编译期确定: 对象的动态类型: 当前对象所指的类型,在运行期决定,对象的动态类 ...