【 bzoj 2661 】 [BeiJing wc2012]连连看 - 拆点费用流
来源:互联网 发布:ubuntu如何使用cd命令 编辑:程序博客网 时间:2024/05/01 21:48
每个数
#include <bits/stdc++.h>using namespace std;#define rep(i,a,b) for (int i = a , _ = b ; i <= _ ; i ++)#define per(i,a,b) for (int i = a , _ = b ; i >= _ ; i --)#define fore(i,u) for (int i = head[u] ; i ; i = nxt[i])inline int rd() { char c = getchar(); while (!isdigit(c)) c = getchar() ; int x = c - '0'; while (isdigit(c = getchar())) x = x * 10 + c - '0'; return x;}const int maxn = 2017;const int maxm = 500007;const int inf = 1000000000;typedef int arr[maxn];typedef int adj[maxm];arr head , dis , pre , vis , lid , rid;adj fr , to , cap , cost , nxt , flow;queue<int> Q;inline int gcd(int a , int b) { return b ? gcd(b , a % b) : a; }inline int sqr(int x) { return x * x; }inline int _sqrt(int x) { int t = (int) sqrt(x + 0.5); if (t * t != x) return -1; return t;}int A , B , ett , S , T , tot;int mx_cost , mx_flow;void input() { ett = 1; A = rd() , B = rd();}inline void ins(int u , int v , int c , int w) { fr[++ ett] = u , to[ett] = v , cap[ett] = c , cost[ett] = w , nxt[ett] = head[u] , head[u] = ett; fr[++ ett] = v , to[ett] = u , cap[ett] = 0 , cost[ett] = -w, nxt[ett] = head[v] , head[v] = ett;}bool spfa() { rep (i , 1 , tot) dis[i] = -inf; dis[S] = 0 , vis[S] = 1 , pre[S] = 0; Q.push(S); while (!Q.empty()) { int u = Q.front(); Q.pop(); vis[u] = 0; fore (i , u) if (cap[i] > flow[i]) { int v = to[i]; if (dis[v] < dis[u] + cost[i]) { dis[v] = dis[u] + cost[i]; pre[v] = i; if (!vis[v]) Q.push(v) , vis[v] = 1; } } } if (dis[T] == -inf) return 0;// assert(!pre[S]); int a = inf; for (int e = pre[T];e;e = pre[fr[e]]) a = min(a , cap[e] - flow[e]); mx_cost += dis[T] * a , mx_flow += a; for (int e = pre[T];e;e = pre[fr[e]]) flow[e] += a , flow[e ^ 1] -= a; return 1;}#define L(x) lid[x]#define R(x) rid[x]//vector<int> lk[maxn];void solve() { rep (i , A , B) lid[i] = ++ tot , rid[i] = ++ tot; rep (x , A , B) rep (y , A , x - 1) { int z = _sqrt(sqr(x) - sqr(y)); if (z == -1 || gcd(z , y) != 1) continue;// lk[x].push_back(ett + 1); ins(L(x) , R(y) , 1 , x + y);// lk[x].push_back(ett + 1); ins(L(y) , R(x) , 1 , x + y); } S = ++ tot , T = ++ tot; rep (i , A , B) ins(S , L(i) , 1 , 0) , ins(R(i) , T , 1 , 0); for (;spfa();)/* printf("%d %d\n" , mx_flow , mx_cost)*/;/* rep (x , A , B) for (int i = 0;i < lk[x].size();i ++) if (cap[lk[x][i]] == flow[lk[x][i]]) printf("%d %d\n" , x , cost[lk[x][i]] - x);*/ printf("%d %d\n" , mx_flow / 2 , mx_cost / 2);}int main() { #ifndef ONLINE_JUDGE freopen("data.txt" , "r" , stdin); #endif input(); solve(); return 0;}
0 0
- 【 bzoj 2661 】 [BeiJing wc2012]连连看 - 拆点费用流
- BZOJ 2661: [BeiJing wc2012]连连看(简单费用流)
- [BZOJ]2661: [BeiJing wc2012]连连看 费用流
- bzoj2661 [BeiJing wc2012]连连看(拆点费用流)
- 【bzoj2661】【BeiJing wc2012】【连连看】【费用流】
- bzoj2661:[BeiJing wc2012]连连看——费用流 + 拆点
- 2661: [BeiJing wc2012]连连看
- BZOJ【bzoj2661】[BeiJing wc2012]连连看
- BZOJ P2661[BeiJing wc2012]连连看
- 【BeiJing wc2012】【BZOJ2661】连连看
- BZOJ2661 / wc2012 连连看【费用流】
- BZOJ 2662 BeiJing wc2012 冻结
- bzoj 2662: [BeiJing wc2012]冻结
- bzoj 2662: [BeiJing wc2012]冻结
- bzoj 2662: [BeiJing wc2012]冻结
- bzoj 2662: [BeiJing wc2012]冻结
- BZOJ-3171 && 2661 循环格&&连连看 最小费用最大流
- bzoj 2659: [Beijing wc2012]算不出的算式
- (二)利用processing绘制自定义图像
- C语言中的 (void*)0 与 (void)0
- 11. Container With Most Water LeetCode
- 1032. 挖掘机技术哪家强
- Oracle中session audsid的产生原理及含义
- 【 bzoj 2661 】 [BeiJing wc2012]连连看 - 拆点费用流
- RGW Create bucket
- BZOJ-2190 仪仗队 数论+欧拉函数(线性筛)
- 为图片添加水印图片
- yum 安装常用软件
- 289. Game of Life LeetCode
- 南山- 旅游景点 - 小宝的家 - 和讯博客
- Android深入理解WebView——上
- 300. Longest Increasing Subsequence LeetCode