题面:BZOJ传送门

和方格取数问题很像啊

但这道题不能像网格那样黑白染色构造二分图,所以考虑拆点建出二分图

我们容易找出数之间的互斥关系,在不能同时选的两个点之间连一条流量为$inf$的边

由于我们是拆点建的图,所以对于两个点$x,y$,$x1$向$y2$连边,$y1$向$x2$连边,边权均为$inf$

然后就是最大权闭合图的裸题了,源点$S$向所有$1$点连边,所有$2$点向汇点$T$连边,边权为$b_{i}$

跑最大流。最终答案是$\sum b_{i}-$最大流$/2$,$/2$是因为拆点求出的是$2$倍的最小割

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 2010
#define M1 1010000
#define ll long long
using namespace std; const int inf=0x3f3f3f3f;
int gint()
{
int ret=,fh=; char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int gcd(int x,int y){ if(!y) return x; return gcd(y,x%y); }
struct Edge{
int head[N1],to[M1<<],nxt[M1<<],flow[M1<<],cte;
void ae(int u,int v,int f)
{
cte++; to[cte]=v; nxt[cte]=head[u];
head[u]=cte; flow[cte]=f;
}
}e; int n,m,hd,tl,S,T;
int dep[N1],cur[N1],que[M1];
int bfs()
{
int x,j,v;
memset(dep,-,(T+)<<); memcpy(cur,e.head,(T+)<<);
hd=,tl=; que[++tl]=S; dep[S]=;
while(hd<=tl)
{
x=que[hd++];
for(j=e.head[x];j;j=e.nxt[j])
{
v=e.to[j];
if( e.flow[j]> && dep[v]==- )
dep[v]=dep[x]+, que[++tl]=v;
}
}
return dep[T]!=-;
}
int dfs(int x,int limit)
{
int j,v,flow,ans=;
if(x==T||!limit) return limit;
for(j=cur[x];j;j=e.nxt[j])
{
v=e.to[j]; cur[x]=j;
if( dep[v]==dep[x]+ && (flow=dfs(v,min(e.flow[j],limit))) )
{
e.flow[j]-=flow; limit-=flow;
e.flow[j^]+=flow; ans+=flow;
if(!limit) break;
}
}
return ans;
}
int Dinic()
{
int ans=;
while(bfs())
ans+=dfs(S,inf);
return ans;
} int a[N1],b[N1];
int main()
{
scanf("%d",&n); S=; T=n+n+;
int i,j,sum=,ans;ll k; e.cte=;
for(i=;i<=n;i++) a[i]=gint();
for(i=;i<=n;i++) b[i]=gint(), sum+=b[i];
for(i=;i<=n;i++) for(j=;j<=n;j++)
{
if(i==j) continue;
if(gcd(a[i],a[j])>) continue;
k=sqrt(1ll*a[i]*a[i]+1ll*a[j]*a[j]);
if(1ll*k*k!=1ll*a[i]*a[i]+1ll*a[j]*a[j]) continue;
e.ae(i,j+n,inf); e.ae(j+n,i,);
}
for(i=;i<=n;i++) e.ae(S,i,b[i]), e.ae(i,S,), e.ae(i+n,T,b[i]), e.ae(T,i+n,);
ans=Dinic();
printf("%d\n",sum-ans/);
bfs();
S=T; bfs();
return ;
}

BZOJ 3158 千钧一发 (最大流->二分图带权最大独立集)的更多相关文章

  1. hdu 1569 &1565 (二分图带权最大独立集 - 最小割应用)

    要选出一些点,这些点之间没有相邻边且要求权值之和最大,求这个权值 分析:二分图带权最大独立集. 用最大流最小割定理求解.其建图思路是:将所有格点编号,奇数视作X部,偶数视作Y部,建立源点S和汇点T, ...

  2. 二分图带权最大独立集 网络流解决 hdu 1569

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  3. 二分图带权匹配 KM算法与费用流模型建立

    [二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和最大或最小.而二分图的最佳匹配则一定为完备匹配,在此基础上,才要求匹配的边权值之和最大 ...

  4. 二分图带权匹配、最佳匹配与KM算法

    ---------------------以上转自ByVoid神牛博客,并有所省略. [二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和 ...

  5. BZOJ 3158: 千钧一发

    3158: 千钧一发 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1201  Solved: 446[Submit][Status][Discuss ...

  6. bzoj 3158 千钧一发(最小割)

    3158: 千钧一发 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 767  Solved: 290[Submit][Status][Discuss] ...

  7. poj 2195 二分图带权匹配+最小费用最大流

    题意:有一个矩阵,某些格有人,某些格有房子,每个人可以上下左右移动,问给每个人进一个房子,所有人需要走的距离之和最小是多少. 貌似以前见过很多这样类似的题,都不会,现在知道是用KM算法做了 KM算法目 ...

  8. bzoj 3158 千钧一发——网络流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3158 发现偶数之间一定满足第二个条件:奇数之间一定满足第一个条件 ( \( (2m+1)^{ ...

  9. 【二分图带权匹配】Anagram @山东省第九届省赛 A

    题目描述 Orz has two strings of the same length: A and B. Now she wants to transform A into an anagram o ...

随机推荐

  1. Bi-shoe and Phi-shoe 欧拉函数 素数

    Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a very popular co ...

  2. php简单的连接数据库

    <?php $conn=@mysql_connect("localhost","root","") or die ("no& ...

  3. Coco2d-js/Cocos2d-html5中Android返回键实现

    导语: 首先Cocos2d-x其中实现Menu和Back按键相对简单一点,而在资源较少的Cocos2d-html5其中.要实现返回还是有一点不一样的,并且有没有详细的demo.也就仅仅有自己去看api ...

  4. 我的红外arduino链接,!!!!

    点击打开链接http://blog.csdn.net/g1342522389/article/details/46272473 一定要赞,小编非常辛苦.

  5. 用Java做的类似皇家守卫战的游戏

    最近因为数据结构的课设缘故,所以用Java做了一款类似皇家守卫战(本人最钟情的一款PC兼手游的塔防游戏)的游戏.现在把这个游戏放出来,可以下载下来 玩耍 学习,代码中我也做了大量的注释.(运行游戏得带 ...

  6. jQuery高性能自己定义滚动栏美化插件

    malihu是一款高性能的滚动栏美化jQuery插件. 该滚动栏美化插件支持水平和垂直滚动栏,支持鼠标滚动,支持键盘滚动和支持移动触摸屏. 而且它能够和jQuery UI和Bootatrap完美的结合 ...

  7. 有一种蓝叫 APEC 蓝

    有如是解释 APEC 者--Air Pollution Eventually Controlled. 有说此次是继零八后的重新万国来朝.丝路大略明白了,西域必通. 站在历史的远处回眸,这是继零八年后重 ...

  8. 【cocos2d-x 3.7 飞机大战】 决战南海I (十二) 游戏结束场景

    游戏结束的时候,要显示分数.还要可以选择是返回主场景还是退出游戏 // 退出游戏 void menuCloseCallback(cocos2d::Ref* pSender); // 返回主界面 voi ...

  9. java 命令行 编译 运行程序

    学习java使用IDE前最好先用用命令行的javac.java来跑一跑简单的程序,这样能够熟悉一下包管理对.class文件路径的影响. 我们先写一段简单的代码: package com.csdn.lk ...

  10. C++ 指针 引用 变量引用

    变量引用: 引用的作用就是给变量起个别名,假如有一个变量a,想给它起个别名b,         可以这么写:int a;//定义a是整型变量.int &b=a;//声明b是a的引用. 上面就是 ...