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 ...
随机推荐
- 双击窗体是模拟键盘上的Tab键
实现效果: 知识运用: SendKeys类的Send方法 //向活动应用程序发送击键 public static void Send (string keys) 实现代码: private void ...
- tp5 -- 微信公众号支付
近来期间比较忙, 忙完之后发现最近有挺多的东西没有整理,于是乎.就将以前用到的一些小东西整理了一下. 如果对您有帮助,则是我最大的幸运. 本篇主要是说了一下整合TP5的微信公众号支付. 不过由于最近T ...
- vuejs 的错误代码,有助于理解
1.vuejs 的双向绑定理解 2.嵌套复杂对象的使用. * 1. 分割都是, 2. json 中分割都是; 4. v-bind:value="param" 括号内的就是 vuej ...
- javaEE(16)_Servlet监听器
一.监听器原理 1.监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 2.监听器典型案例 ...
- ios调试技巧
一.概述1.掌握调试技巧,调试技术最基本,最重要的调试手段包括:单步跟踪,断点,变量观察等.单步跟踪(Step)所谓单步跟踪是指一行一行地执行程序,每执行一行语句后就停下来等待指示,这样你就能够仔细了 ...
- React初识整理(五)--Redux和Flux(解决状态传递问题)
Flux 1.引入:在React的应⽤中,状态管理是⼀个⾮常重要的⼯作.我们不会直接对DOM节点进⾏操作,⽽是通过将数据设置给state,由state来同步UI,这种⽅式有个潜在的问题,每个组件都有独 ...
- 【最长连续零 线段树】bzoj1593: [Usaco2008 Feb]Hotel 旅馆
最长连续零的线段树解法 Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负 责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大 ...
- (29)zabbix执行远程命令
概述 监控,有的人只把他当做报警使用,出现问题之后打开跑回家打开电脑,巴拉巴拉的处理掉,大多数时候都是一些小问题,为何不让zabbix帮你把这些事情处理掉呢?和朋友具体,收到xx硬盘空间慢了.xx服务 ...
- C语言实现链表及其操作
#include <stdio.h> #include <stdlib.h> //定义节点 typedef struct Node { int data; struct Nod ...
- 怎么用js写一个类似于百度输入框的搜索插件
PS:这次做的这个小插件只是在前端实现,并没有经过数据库.需要用到的的框架:1.bootstrap.css的样式 2.Vue.js 最终效果如下: JS部分: $(window).click(func ...