hdu4888 多校B 最大流以及最大流唯一判断+输出方案
题意,给一个矩阵,告诉你每行和、每列和,并且限制所填数不大于k,问矩阵是否唯一。
经典建图不说了,第一次遇到判断最大流唯一性的,学习了:用dfs来判断残网中是否还存在环,若存在,则表明绕这个环走一圈,(流一圈流量),还是最大流保持不变,说明还有解。输出方案就EASY了。
WA了一天:第一TLE,因为这题卡DINIC,我的没有优化,后来在zz1215学长加了一行代码,在增广的时候,若发现最小总流量已经为0,则标记该点层-1(不必要往下)。效果显著。原因2:判断环的时候,dfs判断环写错有木有!不可原谅a!每次枚举每个入口点(感觉可以优化),判断环,遇到子孩子是祖先就证明有环。
#include<cstdio> //600ms
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
using namespace std;
const int maxv=910;
const int maxe=405*405*2+450;
const int inf=0x3f3f3f3f;
int n,m,k;int allsumn=0,allsumm=0;
int nume=0;int e[maxe][4];int head[maxv];
int nsum[405];int msum[405]; bool flag;
void inline adde(int i,int j,int c)
{
e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;
e[nume++][2]=c;
e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;
e[nume++][2]=0;
}
int lev[maxv];int vis[maxv];
int ss=0;int tt=0;
bool bfs()
{
memset(lev,0,sizeof(lev));
memset(vis,0,sizeof(vis));
queue<int>q;
q.push(ss);
vis[ss]=1;
while(!q.empty())
{
int cur=q.front();
q.pop();
for(int i=head[cur];i!=-1;i=e[i][1])
{
int v=e[i][0];
if(e[i][2]>0&&!vis[v])
{
lev[v]=lev[cur]+1;
// if(v==tt)return 1; //这句不加,速度更快
q.push(v);
vis[v]=1;
}
}
}
return vis[tt];
}
int dfs(int u,int minf)
{
if(u==tt||minf==0)return minf;
int sumf=0,f;
for(int i=head[u];i!=-1&&minf;i=e[i][1])
{
int v=e[i][0];
if(lev[v]==lev[u]+1&&e[i][2]>0)
{
f=dfs(v,e[i][2]<minf?e[i][2]:minf);
sumf+=f;
e[i][2]-=f;e[i^1][2]+=f;
minf-=f;
}
}
if(!sumf)lev[u]=-1; //关键优化!
return sumf;
}
int dinic()
{
int sum=0;
while(bfs())
sum+=dfs(ss,inf);
return sum;
}
void init()
{
allsumm=allsumn=nume=0;
memset(head,-1,sizeof(head));
ss=n+m;tt=n+m+1;
}
void read_build()
{
for(int j=0;j<n;j++)
{
scanf("%d",&nsum[j]);
allsumn+=nsum[j];
}
for(int j=0;j<m;j++)
{
scanf("%d",&msum[j]);
allsumm+=msum[j];
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
adde(i,j+n,k);
} for(int i=0;i<n;i++)
{
adde(n+m,i,nsum[i]);
}
for(int i=0;i<m;i++)
{
adde(i+n,n+m+1,msum[i]);
} }
bool dfs_getother_ans(int u,int fa)
{
if(flag)return 1;
for(int i=head[u];i!=-1;i=e[i][1])
{
int v=e[i][0];
if(v==fa||e[i][2]<=0||v==n+m||v==n+m+1)continue;
if(!vis[v])
{
vis[v]=1;
dfs_getother_ans(v,u);
vis[v]=0; //出来的时候标记回来啊!
}
else
{
flag=1;
return 1;
}
if(flag)return 1;
}
return 0;
}
int ansjz[405][405];
int main()
{
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
init();
read_build();
if(allsumm!=allsumn)
{printf("Impossible\n");continue;}
int ans=dinic();
if(ans!=allsumm)
{
printf("Impossible\n");
}
else
{
flag=0;
for(int i=0;i<n;i++)
{
vis[i]=1;
if(dfs_getother_ans(i,-1))
{
flag=1;
break;
}
vis[i]=0;
}
if(flag)
printf("Not Unique\n");
else
{
printf("Unique\n");
for(int i=0;i<=n-1;i++)
for(int j=head[i];j!=-1;j=e[j][1])
{
if(j%2==0)
{
ansjz[i][e[j][0]-n]=k-e[j][2];
}
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(j==m-1)printf("%d\n",ansjz[i][j]);
else printf("%d ",ansjz[i][j]);
}
}
} return 0;
}
hdu4888 多校B 最大流以及最大流唯一判断+输出方案的更多相关文章
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- JAVA之IO流(字符流)
字符流InputStreamReader和OutputStreamWriter是Writer和Read的子类:是字节流通向字符流的桥梁,也就是可以把字节流转化为字符流. InputStreamRead ...
- java IO流 之 其他流
一.内存操作流(ByteArrayInputStream.ByteArrayOutputStream) (一). public class ByteArrayInputStream extends ...
- java IO流 之 字符流
字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...
- JAVA里面的IO流(一)分类2(节点流和处理流及构造方法概要)
IO流根据处理对象的不同分为节点流和处理流. 直接对文件进行处理的流为节点流: 对流进行包装从而实现对文件的优化处理的流为处理流. 节点流类型: 可以看出,节点流主要分这几大类: 文件流 文件流构造方 ...
- Java IO7:管道流、对象流
前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...
- java io流(字符流) 文件打开、读取文件、关闭文件
java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public sta ...
- java 21 - 12 IO流的打印流
打印流 字节流打印流 PrintStream 字符打印流 PrintWriter打印流的特点: A:只有写数据的,没有读取数据.只能操作目的地,不能操作数据源.(只能写入数据到文件中,而不能从文件中提 ...
- Java:IO流之转换流
IO流的基本流情况: 字符流: 字符流缓冲区: FileReader BufferedReader FileWriter ...
随机推荐
- python基础一 day10(2)
复习: # 三元运算符# 接收结果的变量 = 条件为真的结果 if 条件 else 条件为假的结果# 接收结果的变量 = “真结果” if 条件 else “假结果”## 命名空间 和 作用域# 三种 ...
- Pacman常用命令 文内搜索吧
列出已经安装的软件包 https://wiki.archlinux.org/index.php/Pacman_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 维基 pa ...
- Java中的线程--并发库中的集合
线程中的知识点基本都已经学完了,看看Java5并发库中提供的集合... 一.可堵塞队列 队列包含固定长度的队列和不固定长度的队列 ArrayBlockQueue中只有put()方法和take()方法才 ...
- h5快速制作工具-企业级. 非个人无水印
Epub360 Epub是团队引入的专业级H5应用开发工具,能够快速制作出高质量的H5运营交互页面,具有动画控制.交互设定.社交应用和数据应用的特点,其制作过程就类似于制作一个PPT,比较容易上手. ...
- javase(6)_异常
一.异常的概念 1.java异常是Java提供的用于处理程序中错误的一种机制. 2.所谓错误是程序在运行过程中发生的一些异常事件(如:除0,数组下标越界,文件不存在等). 3.Java程序的执行过程中 ...
- java在线聊天项目 swt可视化窗口Design 登录框注册按钮点击改变窗口大小——出现注册面板 实现打开登录框时屏幕居中
登录框注册按钮点击改变窗口大小——出现注册面板 首先用swt可视化设计登录窗口如下图: 此时窗口高度为578 没点击注册时高度为301(可自己定) 注意:注册用户的Jpanel 的border选择T ...
- javascript 写一个随机范围整数的思路
const {random} = Math; //返回 [min,max] 的随机值 //[0,1) * (max - min + 1) => [0,max-min+1) //[0,max-mi ...
- [LUOGU] 1717 钓鱼
题目描述 话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请他吃一次"年年大丰收",为了表示诚意,他还决定亲自去钓鱼,但是,因为 ...
- PHPMailer中文乱码问题的解决方法
之前用PHPMailer帮人家开发了用于发邮件的网站,由于是英文客户,所以中文没怎么测试,最近反馈说 中文乱码! 其实,之前是有发现标题中会出现中文了乱码,已经通过相应的代码解决. 收到反馈之后,查看 ...
- u-boot顶层Makefile分析
1.u-boot制作命令 make forlinx_nand_ram256_config: make all; 2.顶层mkconfig分析,参考 U-BOOT顶层目录mkconfig分析 mkcon ...