bzoj 3275: Number 最小割
来源:互联网 发布:有数据分析软件吗 编辑:程序博客网 时间:2024/03/28 22:43
题意
有N个正整数,需要从中选出一些数,使这些数的和最大。
若两个数a,b同时满足以下条件,则a,b不能同时被选
1:存在正整数C,使a*a+b*b=c*c
2:gcd(a,b)=1
n<=3000。
分析
显然是二分图最小割,但是没想到如何证明这为什么一定是个二分图。。。
第一个条件意思是a和b不能同时为奇数,第二个条件意思是a和b不能同时为偶数。
下面我们来证明一下第一个结论。
假设a和b同为奇数,则必然有
显然有
但由于a和b为奇数,所以可以得到4|2ab不成立。
所以a和b必定不能同为奇数。
代码
#include<iostream> #include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<queue>#include<cmath>using namespace std;typedef long long LL;const int N=3005;const int inf=0x7fffffff;int n,cnt,last[N],dis[N],s,t,cur[N],a[N],ans;struct edge{int to,next,c;}e[N*N];queue<int> q;void addedge(int u,int v,int c){ e[++cnt].to=v;e[cnt].c=c;e[cnt].next=last[u];last[u]=cnt; e[++cnt].to=u;e[cnt].c=0;e[cnt].next=last[v];last[v]=cnt;}bool bfs(){ for (int i=s;i<=t;i++) dis[i]=0; dis[s]=1; while (!q.empty()) q.pop(); q.push(s); while (!q.empty()) { int u=q.front(); q.pop(); for (int i=last[u];i;i=e[i].next) if (e[i].c&&!dis[e[i].to]) { dis[e[i].to]=dis[u]+1; if (e[i].to==t) return 1; q.push(e[i].to); } } return 0;}int dfs(int x,int maxf){ if (x==t||!maxf) return maxf; int ret=0; for (int &i=cur[x];i;i=e[i].next) if (e[i].c&&dis[e[i].to]==dis[x]+1) { int f=dfs(e[i].to,min(e[i].c,maxf-ret)); e[i].c-=f; e[i^1].c+=f; ret+=f; if (maxf==ret) break; } return ret;}void dinic(){ while (bfs()) { for (int i=s;i<=t;i++) cur[i]=last[i]; ans-=dfs(s,inf); }}int gcd(int x,int y){ if (!y) return x; else return gcd(y,x%y);}bool check(int x,int y){ if (gcd(x,y)>1) return 0; int w=sqrt((LL)x*x+(LL)y*y); if (w*w!=x*x+y*y) return 0; else return 1;}int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]),ans+=a[i]; cnt=1; for (int i=1;i<n;i++) for (int j=i+1;j<=n;j++) if (check(a[i],a[j])) { if (a[i]%2==0) addedge(i,j,inf); else addedge(j,i,inf); } s=0;t=n+1; for (int i=1;i<=n;i++) if (a[i]%2==0) addedge(s,i,a[i]); else addedge(i,t,a[i]); dinic(); printf("%d",ans); return 0;}
0 0
- BZOJ 3275 Number 最小割
- bzoj 3275: Number 最小割
- BZOJ 3275: Number 最小割
- BZOJ 3275 Number && 3158 千钧一发 最小割
- 【bzoj 3275】Number(最小割)
- bzoj 3275(最小割)
- 3275: Number 最小割
- 【BZOJ】【P3275】【Number】【题解】【最小割】
- bzoj 2132(最小割)
- bzoj 1934(最小割)
- bzoj 3396(最小割)
- bzoj 2561(最小割)
- bzoj 3894(最小割)
- BZOJ 1497 最小割
- BZOJ 2039 最小割
- BZOJ 1412 最小割
- bzoj 1001 最小割
- bzoj 2561 最小割
- 欢迎使用CSDN-markdown编辑器
- Java EE基础知识学习(七)
- 简单购物车
- 第一讲 Android 屏幕适配基本概念
- photoshop打开图片没反应问题的解决以及改变图片尺寸
- bzoj 3275: Number 最小割
- 数据结构与算法(c++)--prim算法
- LeetCode 148. Sort List
- golang学习笔记之yaml文件处理
- 感觉非常棒的ssm框架搭建
- 2017武汉大学校赛网络预选赛e题
- 在Eclipse中使用Mybatis
- Oracle的trunc函数
- Android常用的15个框架