XWW的难题(bzoj 3698)
Description
XWW是个影响力很大的人,他有很多的追随者。这些追随者都想要加入XWW教成为XWW的教徒。但是这并不容易,需要通过XWW的考核。
XWW给你出了这么一个难题:XWW给你一个N*N的正实数矩阵A,满足XWW性。
称一个N*N的矩阵满足XWW性当且仅当:(1)A[N][N]=0;(2)矩阵中每行的最后一个元素等于该行前N-1个数的和;(3)矩阵中每列的最后一个元素等于该列前N-1个数的和。
现在你要给A中的数进行取整操作(可以是上取整或者下取整),使得最后的A矩阵仍然满足XWW性。同时XWW还要求A中的元素之和尽量大。
Input
第一行一个整数N,N ≤ 100。
接下来N行每行包含N个绝对值小于等于1000的实数,最多一位小数。
Output
输出一行,即取整后A矩阵的元素之和的最大值。无解输出No。
Sample Input
3.1 6.8 7.3 17.2
9.6 2.4 0.7 12.7
3.6 1.2 6.5 11.3
16.3 10.4 14.5 0
Sample Output
HINT
【数据规模与约定】
有10组数据,n的大小分别为10,20,30...100。
【样例说明】
样例中取整后满足XWW性的和最大的矩阵为:
3 7 8 18
10 3 0 13
4 1 7 12
17 11 15 0
/*
上下界最大流。
建立源点SS,从SS向i连一条上下界为(floor(a[i][n]),ceil(a[i][n]))的边;
建立源点TT,从i'向TT连一条上下界为(floor(a[n][i]),ceil(a[n][i]))的边;
建立i->i'上下界为(floor(a[i][j]),ceil(a[i][j]))的边。
跑上下界最大流。
*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#define N 210
#define M 21000
#define inf 1000000000
using namespace std;
int down[N][N],up[N][N],head[N],dis[N],s[N],n,cnt=,SS,TT,S,T;
struct node{int v,f,pre;}e[M];
queue<int> q;
void add(int u,int v,int f){
e[++cnt].v=v;e[cnt].f=f;e[cnt].pre=head[u];head[u]=cnt;
e[++cnt].v=u;e[cnt].f=;e[cnt].pre=head[v];head[v]=cnt;
}
bool bfs(){
memset(dis,-,sizeof(dis));
q.push(S);dis[S]=;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].pre){
if(!e[i].f||dis[e[i].v]!=-) continue;
dis[e[i].v]=dis[u]+;
q.push(e[i].v);
}
}
return dis[T]!=-;
}
int dinic(int x,int f){
int rest=f;
if(x==T) return f;
for(int i=head[x];i;i=e[i].pre){
if(!e[i].f||dis[e[i].v]!=dis[x]+) continue;
int t=dinic(e[i].v,min(rest,e[i].f));
e[i].f-=t;e[i^].f+=t;rest-=t;
}
if(rest==f) dis[x]=-;
return f-rest;
}
int main(){
scanf("%d",&n);
SS=n*+;TT=n*+;S=n*+;T=n*+;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
double x;scanf("%lf",&x);
down[i][j]=int(x);
up[i][j]=int(x+0.99);
}
for(int i=;i<n;i++){
if(down[i][n]!=up[i][n]) add(SS,i,);
if(down[n][i]!=up[n][i]) add(i+n,TT,);
s[SS]+=down[i][n];s[i]-=down[i][n];
s[i+n]+=down[n][i];s[TT]-=down[n][i];
}
for(int i=;i<n;i++)
for(int j=;j<n;j++){
if(down[i][j]!=up[i][j]) add(i,j+n,);
s[i]+=down[i][j];s[j+n]-=down[i][j];
}
int tot=;
for(int i=;i<=T;i++){
if(s[i]>) add(i,T,s[i]),tot+=s[i];
if(s[i]<) add(S,i,-s[i]);
}
add(TT,SS,inf);
int maxflow=;
while(bfs()) maxflow+=dinic(S,inf);
if(maxflow!=tot) {printf("No");return ;}
maxflow=;
S=SS;T=TT;
while(bfs()) maxflow+=dinic(S,inf);
printf("%d",maxflow*);
return ;
}
XWW的难题(bzoj 3698)的更多相关文章
- BZOJ 3698: XWW的难题 [有源汇上下界最大流]
3698: XWW的难题 题意:(1)A[N][N]=0:(2)矩阵中每行的最后一个元素等于该行前N-1个数的和:(3)矩阵中每列的最后一个元素等于该列前N-1个数的和.给A中的数进行取整操作(可以是 ...
- 3698: XWW的难题[有源汇上下界最大流]
3698: XWW的难题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 354 Solved: 178[Submit][Status][Discus ...
- [BZOJ3698] XWW的难题 网络流
3698: XWW的难题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 533 Solved: 275[Submit][Status][Discus ...
- 【BZOJ3698】XWW的难题 有上下界的最大流
[BZOJ3698]XWW的难题 Description XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核.XWW给你出了 ...
- BZOJ 3698: XWW的难题(有源汇上下界最大流)
题面 XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核. XWW给你出了这么一个难题:XWW给你一个N*N的正实数矩阵A, ...
- BZOJ 3698: XWW的难题
Description XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核. XWW给你出了这么一个难题:XWW给你一个N ...
- BZOJ 3698 XWW的难题:有上下界的最大流
传送门 题意 给你一个 $ n*n $ 的正实数矩阵 $ A $ ,满足XWW性. 称一个 $ n*n $ 的矩阵满足XWW性当且仅当: $ A[n][n] = 0 $ 矩阵中每行的最后一个元素等于该 ...
- bzoj 3698 XWW的难题(有源汇的上下界最大流)
[题意] 对每个格子确定上下取整,使得满足1.A[n][n]=0 2.每行列前n-1个之和为第n个 3.格子之和尽量大. [思路] 设格子(i,j)上下取整分别为up(i,j)down(i,j),构图 ...
- BZOJ.3698.XWW的难题(有源汇上下界最大流ISAP)
题目链接 按套路行列作为两部分,连边 \(S->row->column->T\). S向代表行的元素连边cap(A[i][n])(容量上下界为上下取整),代表列的元素向T连边cap( ...
随机推荐
- shell中字符串基本用法
前言 今天在写脚本时,发现前阶段使用过的一些用法还是需要去百度查找,并且找到的答案还需要自己去筛选,耽误写脚本时间,这一篇对字符串之间的比较和逻辑判断都非常详细,借鉴他人之作,资源共享. 本片主要说明 ...
- Vue-Router基础学习笔记
1.安装vue-router npm install vue-router yarn add vue-router 2.引入注册vue-router import Vue from 'vue' imp ...
- MVP模式与MVVM模式
1.mvp模式(Model层 Presenter层 View 层) Model层 :数据层(ajax请求) Presenter层:呈现层,view逻辑相关的控制层,控制层可以去调Model去发ajax ...
- php扩展开发-快速上手
系统环境CentOS release 6.5 (Final) PHP版本php-5.6.27 扩展开发需要有php环境及php的源代码,我的PHP安装目录/home/zhangxiaomin/stud ...
- myeclipse10.5 crack(2012-12-27-bd 写的日志迁移
首先去网上下一个破解文件如图: 解压过后打开的文件夹如图: 再打开crack文件夹如图: 运行run.bat如果点击它没反应就是你没有安装jdk,它如果运行就如图所示: 到这一步就在第一个方框user ...
- python之格式化
python有两种方式可以格式化一种是用%s,一种使用format(2.6)进入的,从下面的代码可以看出,效果差不多. name = 'edward' age = 27 print("My ...
- NAND Flash和NOR Flash的比较
目前Flash主要有两种NOR Flash和NADN Flash.NOR Flash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的 ...
- 快速从mysqldump文件中恢复一个表
快速从较大的mysqldump文件中恢复一个表到数据库中: 1.先获取目标表(md_gas_check_record)在文件中的位置 [publish@LF-PRO-DB-01 ~]$ cat dby ...
- HTML5——7个最牛的HTML5移动开发框架
月的iPhoneDevCamp上写成的.创建它的一个主要动力是基于一个几乎每一个单独的iPhone开发新手都要面对的简单事实:Objective-C是一个对Web开发人员来说非常陌生的环境,并且Web ...
- OpenCV学习笔记(五) 文件存取
转自输入输出XML和YAML文件 To be filled