bzoj 3698 XWW的难题(有源汇的上下界最大流)
【题意】
对每个格子确定上下取整,使得满足1.A[n][n]=0 2.每行列前n-1个之和为第n个 3.格子之和尽量大。
【思路】
设格子(i,j)上下取整分别为up(i,j)down(i,j),构图如下:
- S,Xi,[ down(i,n),up(i,n) ] ,i<n
- Yi,T,[ down(n,i),up(n,i) ] ,i<n
- Xi,Yj,[down(i,j),up(i,j) ] , i<n ,j<n
于是问题转化成了有源汇的上下界最大流问题。
【代码】
- #include<set>
- #include<cmath>
- #include<queue>
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
- #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
- using namespace std;
- typedef long long ll;
- const int N = 4e2+;
- const int inf = 1e9;
- ll read() {
- char c=getchar();
- ll f=,x=;
- while(!isdigit(c)) {
- if(c=='-') f=-; c=getchar();
- }
- while(isdigit(c))
- x=x*+c-'',c=getchar();
- return x*f;
- }
- struct Edge {
- int u,v,cap,flow;
- Edge(int u=,int v=,int cap=,int flow=)
- :u(u),v(v),cap(cap),flow(flow){}
- };
- struct Dinic {
- int n,m,s,t;
- int d[N],cur[N],vis[N];
- vector<int> g[N];
- vector<Edge> es;
- queue<int> q;
- void init(int n) {
- this->n=n;
- es.clear();
- FOR(i,,n) g[i].clear();
- }
- void clear() {
- FOR(i,,(int)es.size()-) es[i].flow=;
- }
- void AddEdge(int u,int v,int w) {
- es.push_back(Edge(u,v,w,));
- es.push_back(Edge(v,u,,));
- m=es.size();
- g[u].push_back(m-);
- g[v].push_back(m-);
- }
- int bfs() {
- memset(vis,,sizeof(vis));
- q.push(s); d[s]=; vis[s]=;
- while(!q.empty()) {
- int u=q.front(); q.pop();
- FOR(i,,(int)g[u].size()-) {
- Edge& e=es[g[u][i]];
- int v=e.v;
- if(!vis[v]&&e.cap>e.flow) {
- vis[v]=;
- d[v]=d[u]+;
- q.push(v);
- }
- }
- }
- return vis[t];
- }
- int dfs(int u,int a) {
- if(u==t||!a) return a;
- int flow=,f;
- for(int& i=cur[u];i<g[u].size();i++) {
- Edge& e=es[g[u][i]];
- int v=e.v;
- if(d[v]==d[u]+&&(f=dfs(v,min(a,e.cap-e.flow)))>) {
- e.flow+=f;
- es[g[u][i]^].flow-=f;
- flow+=f; a-=f;
- if(!a) break;
- }
- }
- return flow;
- }
- int MaxFlow(int s,int t) {
- this->s=s,this->t=t;
- int flow=;
- while(bfs()) {
- memset(cur,,sizeof(cur));
- flow+=dfs(s,inf);
- }
- return flow;
- }
- } dc;
- int n,in[N];
- double a[N][N];
- int main()
- {
- n=read();
- FOR(i,,n) FOR(j,,n) scanf("%lf",&a[i][j]);
- int s=,t=n+n+,S=t+,T=S+;
- dc.init(T+);
- FOR(i,,n-) {
- if(a[i][n]!=(int)a[i][n]) dc.AddEdge(s,i,);
- in[s]-=(int)a[i][n],in[i]+=(int)a[i][n];
- }
- FOR(i,,n-) {
- if(a[n][i]!=(int)a[n][i]) dc.AddEdge(i+n,t,);
- in[i+n]-=(int)a[n][i],in[t]+=(int)a[n][i];
- }
- FOR(i,,n-) FOR(j,,n-) {
- if(a[i][j]!=(int)a[i][j]) dc.AddEdge(i,j+n,);
- in[i]-=(int)a[i][j],in[j+n]+=(int)a[i][j];
- }
- int sum=;
- FOR(i,s,t) {
- if(in[i]>) dc.AddEdge(S,i,in[i]),sum+=in[i];
- if(in[i]<) dc.AddEdge(i,T,-in[i]);
- }
- dc.AddEdge(t,s,inf);
- if(sum!=dc.MaxFlow(S,T)) puts("No");
- else
- printf("%d\n",*dc.MaxFlow(s,t));
- return ;
- }
bzoj 3698 XWW的难题(有源汇的上下界最大流)的更多相关文章
- BZOJ 3698: XWW的难题 [有源汇上下界最大流]
3698: XWW的难题 题意:(1)A[N][N]=0:(2)矩阵中每行的最后一个元素等于该行前N-1个数的和:(3)矩阵中每列的最后一个元素等于该列前N-1个数的和.给A中的数进行取整操作(可以是 ...
- BZOJ.3698.XWW的难题(有源汇上下界最大流ISAP)
题目链接 按套路行列作为两部分,连边 \(S->row->column->T\). S向代表行的元素连边cap(A[i][n])(容量上下界为上下取整),代表列的元素向T连边cap( ...
- bzoj 2502 清理雪道(有源汇的上下界最小流)
[题意] 有一个DAG,要求每条边必须经过一次,求最少经过次数. [思路] 有上下界的最小流. 边的下界为1,上界为无穷.构造可行流模型,先不加ts边跑一遍最大流,然后加上t->s的inf边跑 ...
- LOJ116 - 有源汇有上下界最大流
原题链接 Description 模板题啦~ Code //有源汇有上下界最大流 #include <cstdio> #include <cstring> #include & ...
- 【Loj116】有源汇有上下界最大流(网络流)
[Loj116]有源汇有上下界最大流(网络流) 题面 Loj 题解 模板题. #include<iostream> #include<cstdio> #include<c ...
- loj #116. 有源汇有上下界最大流
题目链接 有源汇有上下界最大流,->上下界网络流 注意细节,重置cur和dis数组时,有n+2个点 #include<cstdio> #include<algorithm> ...
- loj #117. 有源汇有上下界最小流
题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...
- LOJ.117.[模板]有源汇有上下界最小流(Dinic)
题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...
- [poj] 2396 [zoj] 1994 budget || 有源汇的上下界可行流
poj原题 zoj原题 //注意zoj最后一行不要多输出空行 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表不同赛区支出的矩阵.组委会曾经开会讨论过各类支出的总和,以及各赛区 ...
- 【LOJ116】有源汇有上下界最大流(模板题)
点此看题面 大致题意: 给你每条边的流量上下界,让你先判断是否存在可行流.若存在,则输出最大流. 无源汇上下界可行流 在做此题之前,最好先去看看这道题目:[LOJ115]无源汇有上下界可行流. 大致思 ...
随机推荐
- Orcle数据库编程:一
1.PL/SQL是一种块结构的语言,一个PL/SQL程序包含了一个或者多个逻辑块,逻辑块中可以声明变量,变量在使用之前必须先声明. declare mstu student%ROWTYPE;--定义参 ...
- linux 查看某一端口的占用情况
查看某一端口的占用情况: lsof -i:端口号,例如查看端口21是否被占用 lsof -i: 实例:查看端口是否被占用,如果被占用结束掉该端口 [root@localhost splunk]# ls ...
- 转 Android的消息处理机制(图+源码分析)——Looper,Handler,Message
作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设计思想.android源码中包含了大量的设计模式,除此以外,android sdk还精心为我们设计了各种 ...
- 【Linux常用工具】03. Linux性能测试工具ab
在Apache服务器的套件中,有一个叫做 ab (ApacheBench) 的工具. ApacheBench 主要是用来测试Apache服务器执行效率用的 ApacheBench 可以针对某个特定的 ...
- bat拷贝文件
最近在部署服务器的时候,需要用到把一个站点文件拷贝到其他站点.一个一个手动copy太累人了,写了个简单的批处理文件,基本能达到目的,具体怎么做呢: 1.把需要拷贝到各个站点的文件,单独放到一个目录下. ...
- poj 2828 Buy Tickets (线段树)
题目:http://poj.org/problem?id=2828 题意:有n个人插队,给定插队的先后顺序和插在哪个位置还有每个人的val,求插队结束后队伍各位置的val. 线段树里比较简单的题目了, ...
- struct TABLE_SHARE
struct TABLE_SHARE { TABLE_SHARE() {} /* Remove gcc warning */ /** Category of this table. */ TABLE_ ...
- UVa 1636 (概率) Headshot
既然是第一道概率题,就正儿八经地分析一下吧. 题意: 有一个左轮枪,里面随机装了或者没装子弹,用一个01序列表示.现在已知扣动第一次扳机没有子弹,问是继续扣动扳机还是随机转动一下再扣,那种选择使得第二 ...
- sql2005主从数据库同步配置
网站规模到了一定程度之后,该分的也分了,该优化的也做了优化,但是还是不能满足业务上对性能的要求:这时候我们可以考虑使用主从库.主从库是两台服务器上的两个数据库,主库以最快的速度做增删改操作+最新数据的 ...
- wdcp系统升级mysql5.7.11
1.下载解压 下载地址为:http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.12-linux-glibc2.5-x86_64.tar.gz ...