1497: [NOI2006]最大获利

题目:传送门

题解:

  %%%关于最大权闭合子图很好的入门题

  简单说一下什么叫最大权闭合子图吧...最简单的解释就是正权边连源点,负权边连汇点(注意把边权改为正数)然后跑网络流,用正权和-最大流就是答案。

  从这道题我们其实就可以很好的意会:

  st向可以赚钱的点(正权)连一条流量为收益的边,负权点(花钱的)向ed连一条流量为成本的边。

  跑网络流...答案=总收益-成本

  %%%hanks_o大佬

  就像波老师说的:

  如果有一条路径流过的流量等于花费, 说明 利益>=花费,那这条路径肯定要选。

  这样的话,总利益-最大流一定包括了这个利益。

  如果有一条路径流过的流量等于利益,说明 利益<=花费 ,那傻子才去选qwq

  这样的话,总利益-最大流一定把这种情况去除了。

代码水的一匹:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define qread(x)x=read();
using namespace std;
inline int read()
{
int f=,x=;char ch;
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return f*x;
}
struct node
{
int x,y,c,next,other;
}a[];int len,last[];
int st,ed,n,m,head,tail;
void ins(int x,int y,int c)
{
int k1,k2;
len++;k1=len;
a[len].x=x;a[len].y=y;a[len].c=c;
a[len].next=last[x];last[x]=len; len++;k2=len;
a[len].x=y;a[len].y=x;a[len].c=;
a[len].next=last[y];last[y]=len; a[k1].other=k2;
a[k2].other=k1;
}
int list[],h[];
bool bfs()
{
memset(h,,sizeof(h));h[st]=;
list[]=st;head=;tail=;
while(head!=tail)
{
int x=list[head];
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(h[y]== && a[k].c>)
{
h[y]=h[x]+;
list[tail++]=y;
}
}
head++;
}
if(h[ed]>)return true;
return false;
}
int findflow(int x,int flow)
{
if(x==ed)return flow;
int s=,t;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(h[y]==h[x]+ && a[k].c> && flow>s)
{
t=findflow(y,min(a[k].c,flow-s));
s+=t;
a[k].c-=t;a[a[k].other].c+=t;
}
}
if(s==)h[x]=;
return s;
}
int d[];
int sum;
int main()
{
len=;memset(last,,sizeof(last));
qread(n);qread(m);
st=n+m+;ed=n+m+;sum=;
for(int i=;i<=n;i++)
{
qread(d[i]);
ins(i,ed,d[i]);
}
for(int i=;i<=m;i++)
{
int x,y,c;
qread(x);qread(y);qread(c);
sum+=c;
ins(i+n,x,);
ins(i+n,y,);
ins(st,i+n,c);
}
int ans=;
while(bfs())ans+=findflow(st,);
printf("%d\n",sum-ans);
return ;
}

最新文章

  1. xfce4 启用回收站
  2. springmvc下js控制表单提交(表单提交前检验,提交后获取json返回值)
  3. 【leetcode】Compare Version Numbers(middle)
  4. JDK的安装与配置
  5. perl中的运算符
  6. Android自定义实现FlowLayout
  7. tomcat install on Linux
  8. 如何写类库方法、属性等的注释,才能在其他地方调用dll文件时,在代码里出现智能提示?
  9. eclipse打开一闪而过,环境安装正确
  10. 精美的 ( Android, iPhone, iPad ) 手机界面设计素材和线框图设计工具
  11. jquery mobile切换页面的几种方法
  12. 优先级队列用法详解(priority_queue)
  13. iOS和Android开发异同点(一)
  14. [PHP]算法-队列结构的PHP实现
  15. 简单介绍一下在CentOS上安装Docker。
  16. C++ 对Ctrl+Z的解释
  17. Python3练习题系列(07)——列表操作原理
  18. POJ 3250 Bad Hair Day【单调栈入门】
  19. python3 print函数的用法
  20. java集合之vector容器

热门文章

  1. 洛谷 P2700 逐个击破
  2. POJ 1286
  3. JDK1.7中的ThreadPoolExecutor源代码剖析
  4. 从100PV到1亿级PV站点架构演变
  5. html5中调用摄像头拍照
  6. Android用canvas画哆啦A梦
  7. JAVA设计模式之【策略模式】
  8. m_Orchestrate learning system---十、解决bug最根本的操作是什么
  9. 服务器共享session的方式
  10. Android eclipse 运行项目设置程序默认安装到SD卡