BZOJ 3275: Number
2017-04-10 20:19
387 查看
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
53 4 5 6 7
Sample Output
22HINT
n<=3000。分析
可以证明奇数和奇数(不能构成勾股数)、偶数和偶数(最大公因数一定不会是1)是一定可以共存的,所以有可能连边的只可能是奇数和偶数之间所以只要枚举判断每两个奇数和偶数之间能否连边即可代码
#include <bits/stdc++.h> #define INF 0x7fffffff #define N 3005 #define ll long long #define sqr(x) ((x) * (x)) struct NOTE { int to,next,c; }e[N * N]; int s,t; int cnt = 1; int minC; int next ; int cur ; void add(int x,int y,int c) { e[++cnt].to = y; e[cnt].next = next[x]; e[cnt].c = c; next[x] = cnt; e[++cnt].to = x; e[cnt].next = next[y]; e[cnt].c = 0; next[y] = cnt; } int dis ; bool bfs() { std::queue<int> Q; for (int i = s; i <= t; i++) dis[i] = 0; dis[s] = 1; Q.push(s); while (!Q.empty()) { int u = Q.front(); Q.pop(); for (int i = next[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[x] + 1 == dis[e[i].to]) { int f = dfs(e[i].to,std::min(e[i].c,maxf - ret)); ret += f; e[i].c -= f; e[i ^ 1].c += f; if (ret == maxf) break; } } return ret; } void dinic() { while (bfs()) { for (int i = s; i <= t; i++) cur[i] = next[i]; minC += dfs(s,INF); } } int gcd(int x,int y) { if (!y) return x; return gcd(y,x % y); } int n; int num ; int l ; int r ; int lc,rc; int main() { scanf("%d",&n); t = n + 1; s = 0; int sum = 0; for (int i = 1; i <= n; i++) { scanf("%d",&num[i]); if (num[i] & 1) add(s,i,num[i]), l[++lc] = i; else add(i,t,num[i]), r[++rc] = i; sum += num[i]; } for (int i = 1; i <= lc; i++) for (int j = 1; j <= rc; j++) { ll now = sqr(num[l[i]]) + sqr(num[r[j]]); ll tmp = sqrt(now); if (tmp * tmp == now && gcd(num[l[i]],num[r[j]]) == 1) add(l[i],r[j],INF); } dinic(); printf("%d\n",sum - minC); }
相关文章推荐
- bzoj 3275: Number
- bzoj3275 Number
- BZOJ 3275: Number 网络流
- bzoj 3275: Number 最小割
- bzoj3275 Number
- bzoj3275: Number
- BZOJ 3158: 千钧一发 && BZOJ 3275: Number && 考试的T2【网络流
- BZOJ3275: Number
- BZOJ 3275 Number 最小割
- bzoj3275 Number
- BZOJ 3275: Number|网络流
- BZOJ 3158 千钧一发/BZOJ 3275 Number
- BZOJ 3275 Number && 3158 千钧一发 最小割
- bzoj 3275 Number(最小割)
- BZOJ3275 Number (最小割)
- [BZOJ3275]Number(最小割)
- 【bzoj 3275】Number(最小割)
- bzoj3275 Number
- BZOJ 3275: Number
- BZOJ3275 Number