Number BZOJ3275 最大流 原创 fish04 2022-05-27 20:07:33 博主文章分类:网络流 ©著作权 文章标签 #include #define i++ 文章分类 后端开发 ©著作权归作者所有:来自51CTO博客作者fish04的原创作品,请联系作者获取转载授权,否则将追究法律责任 有N个正整数,需要从中选出一些数,使这些数的和最大。 若两个数a,b同时满足以下条件,则a,b不能同时被选 1:存在正整数C,使a*a+b*b=c*c 2:gcd(a,b)=1 Sample Output22Input 第一行一个正整数n,表示数的个数。n<=3000 第二行n个正整数a1,a2,...an Output最大的和Sample Input5 3 4 5 6 7 首先可以发现,只有奇数和偶数才可能满足上面两个条件;那么我们把序列分为奇偶两部分;设源点st,汇点ed;st 和奇数连边,ed 和偶数连边;那么我们遍历可能的连边,O(n^2);这个连边权值设为 inf;(有点最大权闭合子图的意思?那么我们求最小割即可;最后就是sum-dinic();#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include//#include//#pragma GCC optimize(2)using namespace std;#define maxn 300005#define inf 0x3f3f3f3f#define INF 9999999999#define rdint(x) scanf("%d",&x)#define rdllt(x) scanf("%lld",&x)#define rdult(x) scanf("%lu",&x)#define rdlf(x) scanf("%lf",&x)#define rdstr(x) scanf("%s",x)typedef long long ll;typedef unsigned long long ull;typedef unsigned int U;#define ms(x) memset((x),0,sizeof(x))const long long int mod = 1e9 + 7;#define Mod 1000000000#define sq(x) (x)*(x)#define eps 1e-3typedef pair pii;#define pi acos(-1.0)const int N = 1005;#define REP(i,n) for(int i=0;i<(n);i++)typedef pair pii;inline ll rd() { ll x = 0; char c = getchar(); bool f = false; while (!isdigit(c)) { if (c == '-') f = true; c = getchar(); } while (isdigit(c)) { x = (x << 1) + (x << 3) + (c ^ 48); c = getchar(); } return f ? -x : x;}ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a%b);}ll sqr(ll x) { return x * x; }/*ll ans;ll exgcd(ll a, ll b, ll &x, ll &y) { if (!b) { x = 1; y = 0; return a; } ans = exgcd(b, a%b, x, y); ll t = x; x = y; y = t - a / b * y; return ans;}*/ll qpow(ll a, ll b, ll c) { ll ans = 1; a = a % c; while (b) { if (b % 2)ans = ans * a%c; b /= 2; a = a * a%c; } return ans;}int n, m;int st, ed;struct node { int u, v, nxt, w;}edge[maxn<<2];int head[maxn], cnt;void addedge(int u, int v, int w) { edge[cnt].u = u; edge[cnt].v = v; edge[cnt].w = w; edge[cnt].nxt = head[u]; head[u] = cnt++;}int rk[maxn];int bfs() { queueq; ms(rk); rk[st] = 1; q.push(st); while (!q.empty()) { int tmp = q.front(); q.pop(); for (int i = head[tmp]; i != -1; i = edge[i].nxt) { int to = edge[i].v; if (rk[to] || edge[i].w <= 0)continue; rk[to] = rk[tmp] + 1; q.push(to); } } return rk[ed];}int dfs(int u, int flow) { if (u == ed)return flow; int add = 0; for (int i = head[u]; i != -1; i = edge[i].nxt) { int v = edge[i].v; if (rk[v] != rk[u] + 1 || !edge[i].w)continue; int tmpadd = dfs(v, min(edge[i].w, flow - add)); if (!tmpadd) { rk[v] = -1; continue; } edge[i].w -= tmpadd; edge[i ^ 1].w += tmpadd; add += tmpadd; } return add;}int ans;void dinic() { while (bfs())ans += dfs(st, inf);}int a[maxn];bool check(int a, int b) { if(a % 2 == 1 && b % 2 == 1)return 0; if (gcd(a, b) != 1)return 0; ll sum = a * a + b * b; int p = (int)sqrt(sum); if (p*p != sum)return 0; return 1;}int main(){ //ios::sync_with_stdio(0); memset(head, -1, sizeof(head)); rdint(n);int sum = 0; for (int i = 1; i <= n; i++)rdint(a[i]), sum += a[i]; st = n + 1; ed = st + 1; for (int i = 1; i <= n; i++) { if (a[i] & 1)addedge(st, i, a[i]), addedge(i, st, 0); else addedge(i, ed, a[i]), addedge(ed, i, 0); } for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { if (check(a[i], a[j])) { if (a[i] & 1)addedge(i, j, inf), addedge(j, i, 0); else addedge(j, i, inf), addedge(i, j, 0); } } } dinic(); cout << sum - ans << endl; return 0;} EPFL - Fighting 赞 收藏 评论 分享 举报 上一篇:[USACO5.4]奶牛的电信Telecowmunication 最小割 下一篇:[JLOI2010]冠军调查 BZOJ2768 最小割 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 () 最热 最新 相关文章 psql窗口函数 ROW_NUMBER的应用 psql窗口函数的使用 窗口函数 一对多 表结构 java获取当月最大日 java获取当月最大日 System java 字段 mysql每次最大插入条数 MySQL 每次最大插入条数并不是一个固定的限制,这取决于多个因素,如表的索引大小、服务器的内存、每行的数据大小、事务的大小等。但是,为了优化性能,可以通过批量插入来减少操作次数,以下是一个简单的批量插入示例:INSERT INTO your_table (column1, column2, ...)VALUES(value1a, value2a, ...),(value1b, value2 MySQL 服务器 批量插入 Number BZOJ3275 最大流 Number BZOJ3275 最大流 有N个正整数,需要从中选出一些数,使这些数的和最大。 若两个 #include #define i++ BZOJ 3275 Number 最小割 题目大意:给定n个数,如果两个数互质且平方和为完全平方数则不能同时被选,求选出一些数的最大和首先这肯定是网络流无误 但是建图十分巧妙很容易发现两个奇数不满足条件一 两个偶数不满足条件2于是这是一个二分图 跑最小割即可#include #include #include #include #include #define M 3030#define S 0#define BZOJ BZOJ3275 最小割 Dinic #include BZOJ 3275: Number 最小割 3275: NumberTime Limit: 10 Sec Memory Limit: 128 MBSubmit: 1057 Solved: 439[Submit][Status][Discuss]Description有N个正整数,需要从 #include i++ Memory BZOJ 3275: Number (二分图最小割) 题意有nnn个数,其中同时满足下面两个条件的数对不能同时选,求选出一些了.但是乍一看不是二分图的模型,就不能直接... #include Max 二分图 【BZOJ】【3275】Numbers 网络流/最小割 Orz了Jiry_2神犇,蒟蒻网络流建模什么的完全不会啊T_T 按奇偶性来分组实在太巧妙了……然后相关的点之间连边表示只能选其一,来求最小割…… 1 /************************************************************** ... BZOJ 网络流 思路题 最小割 #include BZOJ 1458: 士兵占领 最大流 1458: 士兵占领Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1099 Solved: 618[Submit][Status][Discuss]Description有一个M * N的棋盘,有的 #include i++ Memory BZOJ 2150: 部落战争 最大流 2150: 部落战争Time Limit: 1 Sec Memory Limit: 256 MB题目连接http://www.lydsy.com/JudgeOnline/problem.php?id=2150Descriptionlanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A... IT BZOJ 1458: 士兵占领 网络最大流 Description有一个M * N的棋盘,有的格子是障碍。现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵。我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵, 第j列至少放置了Cj个士兵。现在你的任务是要求使用最少个数的士兵来占领整个棋盘。 Input第一行两个数M, N, K分别表示棋盘的行数,列数以及障碍的个数。 第二行有M个数表示Li。 i++ 最大流 #include BZOJ 1458 士兵占领 Dinic最大流 题目大意:给定一个m*n的棋盘,其中k个点有障碍,要求放置最少的士兵,使第i行有至少L[i]个,第j列有至少C[j]个 BZOJ BZOJ1458 Dinic 网络流 i++ BZOJ 3275 Number 最小割。 网络流不要写错。 #include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<queue>#define maxn 5050#define maxv 20050#define maxe 400050# #include #define i++ ios 最小割 bzoj3275: Number 很早nannan就安利了这题,一开始以为是DP/贪心,没想到是网络流 然后呢有一个很重要的性质,由于第一条限制,奇数和奇数不能构成勾股数,然后第二条性质也注定偶数和偶数不会互相影响。 所以就可以把奇偶分成两个集合。 然后最小割 #include 网络流 ios 最小割 i++ bzoj3275 容易想到是最小割(最大权独立集)然后每个数拆成两个点,不能同时选的之间连边跑最小割,最后答案=总数-mincut/2 因为这样建图将流量变成了原来的两倍当然这道题更好的建图方法是分成奇数和偶数两个集合不难发现,奇数和奇数,偶数和偶数之间显然不能同时满足条件的所以这样直接ans=总点数-mincut 1 const inf=100000007; 2 type node=record 最小割 编程 【BZOJ3275】Number 最小割 【BZOJ3275】Number Description 有N个正整数,需要从中选出一些数,使这些数的和最大。若两个数a,b同时满足以下条件,则a,b不能同时被选1:存在正整数C,使a*a+b*b=c*c2:gcd(a,b)=1 有N个正整数,需要从中选出一些数,使这些数的和最大。若两个数a,b同时 BZOJ 网络流 #include i++ 最小割 bzoj 3275 Number(最小割) 【题意】 给定n个数,要求选出一些数满足 1.存在c,a*a+b*b=c*c 2.gcd(a,b)=1 使得和最大。 【思路】 二分图的最大权独立集(可以这么叫么QAQ 先拆点,对于不满足条件的两个点,连边(u,v’,inf),(v,u’,inf),另外连边(S,u,a[u]),(u,T,a[u]) 冲刺省选 #include #define git ios BZOJ 3158 千钧一发/BZOJ 3275 Number 2333333 #include i++ #define ios BZOJ bzoj1452 最大流 很明显最大流。。 i++ #define c++ #include 最大流 bzoj 1458 士兵占领(最大流) 【题意】 n行m列,第i行必须放L[i],第j列必须放C[j],有障碍格,求满足条件至少需要放多少。 【思路】 至少放多少等价于最多不放多少。 对行列分别建XY点,则连边(S,Xi,a)(Yi,T,b),a表示i行可以放到数目-需要放的数目,b类似。对于不是障碍的格子(i,j),连边(Xi,Yj,1 冲刺省选 #include #define git ios centos arm搭建网盘服务器 前言鉴于各大网络云盘的各种限制,收费制度和用户体验并不好,利用VPS来搭建一个私有云盘就会变得越来越受欢迎,目前主流的开源软件ownCloud,NexCloud等都可以实现,下面我们就选ownCloud来搭建。准备一台VPS服务器 (请问现在有便宜点的vps吗? - Thomas Shelby的回答 - 知乎 https://www.zhihu.com/question/307249234/ans centos arm搭建网盘服务器 centos7 php 环境 centos7 访问php页面显示源码 php 数据库 coap springboot集成 文章目录Spring Cache详细介绍1. Spring Cache基础知识2. Spring Cache的注解3. Spring Cache的使用4. 自定义缓存管理器5. 小结 Spring Cache详细介绍缓存是一种保存数据副本的技术,可以快速访问之前保存的数据。Spring Cache是Spring Framework中的一部分,为Java应用提供了通用的缓存抽象,使得我们可以使用各 coap springboot集成 spring boot spring java 缓存 python 的父子窗口绑定 进程Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。 子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调 python 的父子窗口绑定 python 操作系统 进程 多进程 sparksql里面炸裂函数怎么写 7.1 系统内置函数查看系统函数-- 查看系统自带函数 show functions; -- 显示自带函数的用法 desc function upper; desc function extended upper;7.1.1 日期函数【重要】-- 当前前日期 select current_date; select unix_timestamp(); -- 建议使用current_timesta sparksql里面炸裂函数怎么写 hive 大数据 数据 ci centos7 本机监控网卡流量并留存日志 Linux学习之初,认识Linux和如何安装centos7系统第一章:学习之初1.养成新的习惯。习惯使用命令行;输完命令之后确认命令无误在按空格;密码安全要注意;学习要稳重求进,打牢基础;多做总结,每一次操作都有新的手收获;学习新的内容也别忘了复习前面的内容;多做尝试,每一个变化解决了,就是新的收获。2.课程学习的一些连接资料。r.aminglinux.com 学习资源软件包,连接,下载地址 运维 操作系统 shell centos 下载地址