bzoj 3996 线性代数 —— 最大权闭合子图

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3996

把题中的式子拆开看看,发现就是如下关系:

如果 a[i] == 1 && a[j] == 1,则 b[i][j] 有贡献;

如果 a[i] == 1,则 -c[i] 有贡献;

所以就是最大权闭合子图的模型,b[i][j] 向 a[i] 和 a[j] 连边,a[i] 向 c[i] 连边;

而 c[i] 这个点实际上没什么用,直接变成 a[i] 向 T 连边,边权是 c[i] 即可。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int const xn=300005,xm=(xn<<3),inf=0x3f3f3f3f;
int n,hd[xn],ct,to[xm],nxt[xm],c[xm],S,T,dis[xn],cur[xn];
queue<int>q;
int rd()
{
  int ret=0,f=1; char ch=getchar();
  while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=0; ch=getchar();}
  while(ch>=‘0‘&&ch<=‘9‘)ret=ret*10+ch-‘0‘,ch=getchar();
  return f?ret:-ret;
}
void ade(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct; c[ct]=z;}
void add(int x,int y,int z){ade(x,y,z); ade(y,x,0);}
bool bfs()
{
  while(q.size())q.pop();
  memset(dis,0,sizeof dis);
  dis[0]=1; q.push(0);
  while(q.size())
    {
      int x=q.front(); q.pop();
      for(int i=hd[x],u;i;i=nxt[i])
    if(!dis[u=to[i]]&&c[i])dis[u]=dis[x]+1,q.push(u);
    }
  return dis[T];
}
int dfs(int x,int fl)
{
  if(x==T)return fl;
  int ret=0;
  for(int &i=cur[x],u;i;i=nxt[i])
    {
      if(dis[u=to[i]]!=dis[x]+1||!c[i])continue;
      int tmp=dfs(u,min(fl-ret,c[i]));
      if(!tmp)dis[u]=0;
      c[i]-=tmp; c[i^1]+=tmp;
      ret+=tmp; if(ret==fl)break;
    }
  return ret;
}
int main()
{
  n=rd(); S=0; T=n*n+n+1; int ans=0;
  for(int i=1,cnt=0;i<=n;i++)
    for(int j=1,x;j<=n;j++)
      {
    x=rd(); cnt++; ans+=x;
    add(S,cnt,x);
    add(cnt,n*n+i,inf); add(cnt,n*n+j,inf);
      }
  for(int i=1,x;i<=n;i++)x=rd(),add(n*n+i,T,x);
  while(bfs())
    {
      memcpy(cur,hd,sizeof hd);
      ans-=dfs(S,inf);
    }
  printf("%d\n",ans);
  return 0;
}

原文地址:https://www.cnblogs.com/Zinn/p/10118249.html

时间: 2024-09-30 11:46:27

bzoj 3996 线性代数 —— 最大权闭合子图的相关文章

hdu 3996 Gold Mine 最大权闭合子图

Gold Mine Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2374    Accepted Submission(s): 514 Problem Description Long long ago, there is a gold mine.The mine consist of many layout, so some are

BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图

链接 BZOJ 4873 题解 当年的省选题--还记得蒟蒻的我Day1 20分滚粗-- 这道题是个最大权闭合子图的套路题.严重怀疑出题人就是先画好了图然后照着图编了个3000字的题面.和我喜欢的妹子当年给别人写的情书一样长-- 最大权闭合子图 最大权闭合子图问题:一个有向图中,每个点带有一个权值(有正有负),有向边\(u \to v\)表示选\(u\)必须选\(v\),选出一些点使权值和最大,问权值和最大是多少. 最大权闭合子图的解法:网络流建图,对于每个点\(u\),设权值为\(w_u\),如

[BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以考虑最大权闭合子图 假设a与b之间有权值为c的边(根据题意是双向边) 那么我们可以建一个新节点,点的权值为c,并指向a点和b点(单向),同时断掉原本a,b之间的双向边,a,b的点的权值是它们的花费(负的) 那么对于原问题就转化成了求最大权闭合子图的问题了 ——————————————————————

BZOJ 1565 植物大战僵尸(拓扑排序+最大权闭合子图)

图中的保护关系就类似于最大权闭合子图.即你想杀x,你就一定要杀掉保护x的点,那么把x向保护它的点连边.那么题目就转化成了最大权闭合子图的问题. 但是这个图有点特殊啊... 考虑有环的情况,显然这个环以及指向这个环的点都不能选. 所以还要把这个图的反图进行一遍拓扑排序,这样忽略掉了这些点了... # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # i

bzoj 1497 [NOI2006]最大获利【最大权闭合子图+最小割】

不要被5s时限和50000点数吓倒!大胆网络流!我一个5w级别的dinic只跑了1s+! 看起来没有最大权闭合子图的特征--限制,实际上还是有的. 我们需要把中转站看成负权点,把p看成点权,把客户看成正权点,把c看成点权,然后把中转站点a.b作为客户点的依赖点 s点向所有正权点连边,流量为点权:所有负权点向t连边,流量为负点权(即正数!) 对于所有有依赖关系的点,由客户点向中转站点连边,流量为inf,也就是最大权闭合子图中的向其依赖点连边 连边的意义详见:http://www.cnblogs.c

BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图

Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D Input 第一行输入一个整数N,接下来N行输入B矩阵,第i行第J个数字代表Bij. 接下来一行输入N个整数,代表矩阵C.矩阵B和矩阵C中每个数字都是不超过1000的非负整数. Output 输出最大的D Sample Input 3 1 2 1 3 1 0 1 2 3 2 3 7 Sample Output 2 HINT 1<=N<

我和最大权闭合子图

第一次接触最大权闭合子图大概是2017年3月27号星期一,那段时间有5个同学(ZJC/LKQ/LWD/WJJ/...)去了湖南师大附中听PTY.BK他们讲课,因为我没有去Hfu一直很怪罪.后来安排我和LXY在70去电子科大之前去考一周的试,上午LXY的Mom接送,下午我们坐metro到世纪城再让LXY的Mom送回学校上晚自习.那一天我去70,T1是分治Floyd,T2是轮廓线DP,T3是一道最大权闭合子图(后来知道是BZOJ 3774 最优选择).那时我只会Dinic的模板,我的初高中学长Ana

BZOJ1565 NOI 2009 植物大战僵尸 topo+最小割(最大权闭合子图)

题目链接:https://www.luogu.org/problemnew/show/P2805(bzoj那个实在是有点小小的辣眼睛...我就把洛谷的丢出来吧...) 题意概述:给出一张有向图,这张有向图上的每个点都有一个点权,想要访问某个点必须要先访问这个点所能够访问(遍历)到的所有点,在访问到一个点之后将会得到这个点的权值(可正可负).问访问这张图可以得到的最大点权和. 原题说过来说过去实际上是描述了一个植物之间的保护关系,也就是说明了植物之间的先后访问顺序之间的关系.可以描述为要"要访问点

最大权闭合子图 ( 最大流最小割模型 )

引入闭合子图的概念 : 通俗点说就是选出一个图的子图,使得子图中的所有点出度指向的点依旧在这个子图内,则说明此子图是闭合子图. 最大权闭合子图 : 假设每个点具有点权值,在一个图的所有闭合子图中,点权之和最大的即是最大权闭合子图. 求取最大权闭合子图的权值之和是有一个结论的 一.先抽象出一个超级源.汇点 二.将权值为正的点和超级源点连接.容量为权值 三.将权值为负的点和超级汇点连接.容量为权值的绝对值 四.然后除了源.汇之外的点原本怎么连泽怎么连.且容量为无穷大 五.最大权闭合子图权值  =