S->每个奇数,每个偶数->T各连一条边, 容量为这个数字.然后不能同时选的两个数连容量为+oo的边. 总数-最大流即是答案.

因为满足a2+b2=c2的a,b一定是一奇一偶或者两个偶数, 2偶不满足gcd=1, 所以两个数不能同时选一定是一奇一偶.

---------------------------------------------------------------------

#include<bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
 
const int maxn = 3009;
const int INF = 0x7FFFFFFF;
 
struct edge {
int to, cap;
edge *next, *rev;
} E[1000000], *pt = E, *head[maxn];
 
inline void add(int u, int v, int w) {
pt->to = v; pt->cap = w; pt->next = head[u]; head[u] = pt++;
}
inline void addedge(int u, int v, int w) {
add(u, v, w); add(v, u, 0);
head[u]->rev = head[v];
head[v]->rev = head[u];
}
 
edge *cur[maxn], *p[maxn];
int h[maxn], cnt[maxn], S, T, N;
 
int maxFlow() {
memset(cnt, 0, sizeof cnt);
memset(h, 0, sizeof h);
cnt[0] = N;
edge* e;
int flow = 0;
for(int x = S, A = INF; h[S] < N; ) {
for(e = cur[x]; e; e = e->next)
if(e->cap && h[e->to] + 1 == h[x]) break;
if(e) {
p[e->to] = cur[x] = e;
A = min(e->cap, A);
x = e->to;
if(x == T) {
for(; x != S; x = p[x]->rev->to) {
p[x]->cap -= A;
p[x]->rev->cap += A;
}
flow += A;
A = INF;
}
} else {
if(!--cnt[h[x]]) break;
h[x] = N;
for(e = head[x]; e; e = e->next) if(e->cap && h[e->to] + 1 < h[x]) {
cur[x] = e;
h[x] = h[e->to] + 1;
}
cnt[h[x]]++;
if(x != S) x = p[x]->rev->to;
}
}
return flow;
}
 
int num[maxn];
 
int gcd(int x, int y) {
return y ? gcd(y, x % y) : x;
}
 
bool check(int x, int y) {
int h = gcd(x, y);
if(h != 1) return false;
ll t = ll(x) * x + ll(y) * y;
t = (ll)sqrt(t);
if(t * t == ll(x) * x + ll(y) * y) return true;
return false;
}
 
int main() {
int n; scanf("%d", &n);
int tot = 0;
S = 0; T = n + 1; N = T + 1;
for(int i = 1; i <= n; i++) {
scanf("%d", num + i);
tot += num[i];
num[i] & 1 ? addedge(S, i, num[i]) : addedge(i, T, num[i]);
}
for(int i = 1; i <= n; i++) if(num[i] & 1)
for(int j = 1; j <= n; j++) if(!(num[j] & 1))
if(check(num[i], num[j])) addedge(i, j, INF);
printf("%d\n", tot - maxFlow());
return 0;
}

---------------------------------------------------------------------

3275: Number

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 504  Solved: 222
[Submit][Status][Discuss]

Description

有N个正整数,需要从中选出一些数,使这些数的和最大。
若两个数a,b同时满足以下条件,则a,b不能同时被选
1:存在正整数C,使a*a+b*b=c*c
2:gcd(a,b)=1

Input

第一行一个正整数n,表示数的个数。
第二行n个正整数a1,a2,?an。
 
 

Output

最大的和。
 

Sample Input

5
3 4 5 6 7

Sample Output

22

HINT

n<=3000。

Source

BZOJ 3275: Number( 最小割 )的更多相关文章

  1. bzoj 3275 Number(最小割)

    [题意] 给定n个数,要求选出一些数满足 1.存在c,a*a+b*b=c*c 2.gcd(a,b)=1  使得和最大. [思路] 二分图的最大权独立集(可以这么叫么QAQ 先拆点,对于不满足条件的两个 ...

  2. BZOJ 3275: Number (二分图最小割)

    题意 有nnn个数,其中同时满足下面两个条件的数对不能同时选,求选出一些数让和最大. 若两个数aaa,bbb同时满足以下条件,则aaa,bbb不能同时被选 存在正整数ccc,使a∗a+b∗b=c∗ca ...

  3. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  4. 【BZOJ3275】Number 最小割

    [BZOJ3275]Number Description 有N个正整数,需要从中选出一些数,使这些数的和最大.若两个数a,b同时满足以下条件,则a,b不能同时被选1:存在正整数C,使a*a+b*b=c ...

  5. spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】

    因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...

  6. bzoj 2229 [Zjoi2011]最小割(分治+最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2229 [题意] 回答若干个关于割不超过x的点对数目的询问. [思路] [最小割最多有n ...

  7. [置顶] [BZOJ]2127: happiness 最小割

    happiness: Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己 ...

  8. BZOJ 2561: 最小生成树(最小割)

    U,V能在最小(大)生成树上,当且仅当权值比它小(大)的边无法连通U,V. 两次最小割就OK了. --------------------------------------------------- ...

  9. bzoj 2229: [Zjoi2011]最小割

    Description 小白在图论课上学到了一个新的概念--最小割,下课后小白在笔记本上写下了如下这段话: "对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同 ...

随机推荐

  1. 数据可视化开源系统(python开发)

    Caravel 是 Airbnb (知名在线房屋短租公司)开源的数据探查与可视化平台(曾用名Panoramix),该工具在可视化.易用性和交互性上非常有特色,用户可以轻松对数据进行可视化分析. 核心功 ...

  2. Android 开发笔记 “The constructor AlertDialog.Builder(new View.OnKeyListener(){}) is undefined”

    1.The constructor AlertDialog.Builder(new View.OnKeyListener(){}) is undefined等,应该有很多类似问题 比如你的源码文件名是 ...

  3. IOS 学习笔记(5) 控件 文本视图(UITextView)的使用方法

    相对于UILabell所支持的较短文本内容,UITextView对于长文本的支持更好.UITextView能够以滚动的方式全部浏览到长文本,并且就像UILabel那样,从ISO6,他也提供了对NSAt ...

  4. mabatis mapper开发规范

    定义一个mapper接口 package mapper; import pojo.User; public interface UserMapper { public User getUser(int ...

  5. ISO14443 ISO15693 ISO18000

    [提要]射频标签的通信标准是标签芯片设计的依据,目前国际上与RFID相关的通信标准主要有:ISO/IEC 18000标准(包括7个部分,涉及125KHz, 13.56MHz, 433MHz, 860- ...

  6. S70卡

    产品名称:Mifare 4K(S70)卡 芯片类型:Philips Mifare 1 S70(MOA2) 存储容量:32Kbit,32个分区,每分区两组密码   工作频率:13.56 MHz   通讯 ...

  7. python OptionParser模块

    Python中强大的选项处理模块. #!/usr/bin/python from optparse import OptionParser parser = OptionParser() parser ...

  8. java.lang.UnsupportedClassVersionError: Bad version number in .class file 解决方案

    在Myeclipse中运行小应用程序时出现如下异常的解决办法 java.lang.UnsupportedClassVersionError: Bad version number in .class ...

  9. perl5 第十二章 Perl5中的引用/指针

    第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用  子程序模板七.数组与子程序八.文件句 ...

  10. BZOJ 2463 谁能赢呢?

           刚开始做这道题时,我纠结了许久什么是最优走法,想了好半天也不晓得,后来被大神点醒,最有走法,最后就是每个格子都走了一遍,得,这下简单多了,算一下总共的格数是奇数还是偶数,奇数则先手赢,偶 ...