【2014 Multi-University Training Contest 3 1002】/【HDU 4888】 Redraw Beautiful Drawings
不easy啊。最终能够补第二个题了。!
顺便说一句:模版写残了就不要怪出题人啊 ~ (这残废模版研究了好长时间才找出错)
题目大意:
有一个n*m的矩阵。每个格子里都将有一个数。给你每一行数字之和和每一列数字之和。
求每个位置能填0~k之间的哪个数。假设有多种可能输出“Not Unique”,假设没有解输出“Impossible”,假设一组解则将其输出。
解题思路:
最大流:
不可能的条件:是行之和和列之和不想等或者建图后的最大流与他们不想等。
多组的条件是:在最大流后的残流网络中有长度大于2的环(实际中最少大于3)。
以下是代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h> #define eps 1e-9
#define pi acos(-1.0)
#define inf 107374182
#define inf64 1152921504606846976
#define clear1(A, X, SIZE) memset(A, X, sizeof(A[0]) * (SIZE))
#define clearall(A, X) memset(A, X, sizeof(A))
#define memcopy1(A , X, SIZE) memcpy(A , X ,sizeof(X[0])*(SIZE))
#define memcopy1all(A, X) memcpy(A , X ,sizeof(X))
#define max( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define min( x, y ) ( ((x) < (y)) ? (x) : (y) ) using namespace std; const int maxn=1000+10;
const int maxm=200000+10; struct node
{
int v,w,next;
node(int v=0,int w=0,int next=0):v(v),w(w),next(next) {};
} edge[maxm<<1];
int head[maxn],d[maxn],nEdge,S,T;
bool vis[maxn];
int n,m,K;
void addedge(int from,int to,int cap)
{
edge[++nEdge]=node(to,cap,head[from]);
head[from]=nEdge;
edge[++nEdge]=node(from,0,head[to]);
head[to]=nEdge;
}
int deep[maxn];
bool bfs()
{
memset(deep,-1,sizeof(deep));
queue<int>q;
q.push(S);//源点
deep[S]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
int p=head[u];
while(p!=-1)
{
int v=edge[p].v;
if(deep[v]==-1&&edge[p].w>0)
{
q.push(v);
deep[v]=deep[u]+1;
}
p=edge[p].next;
}
}
return deep[T]!=-1; //汇点 }
int DFS(int src ,int flow)
{
if(src==T||flow==0)return flow;
int sum=0,temp;
int p=head[src];
while(p!=-1)
{
int v=edge[p].v;
if(deep[v]==deep[src]+1&&edge[p].w>0)
{
temp=DFS(v,min(flow-sum,edge[p].w));
edge[p].w-=temp;
edge[p^1].w+=temp;
sum+=temp;
if(flow-sum==0) return sum;
}
p=edge[p].next;
}
deep[src]=-1;
return sum;
}
bool dfs(int u,int fa)
{
for(int k=head[u]; k!=-1; k=edge[k].next)
{
if(k==(fa^1)) continue;
if(edge[k].w)
{
if(vis[edge[k].v]) return true;
vis[edge[k].v]=true;
if(dfs(edge[k].v,k)) return true;
vis[edge[k].v]=false;
}
}
return false;
}
int mat[404][404];
void ptmat()
{
printf("Unique\n");
memset(mat,0,sizeof(mat));
for(int u=1; u<=n; ++u)
{
for(int k=head[u]; k!=-1; k=edge[k].next)
{
int v=edge[k].v;
if(v>n&&v<=n+m)
mat[u][v-n]=K-edge[k].w;
}
}
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
if(j>1) printf(" ");
printf("%d",mat[i][j]);
}
printf("\n");
}
}
int main()
{
while(scanf("%d%d%d",&n,&m,&K)!=EOF)
{
memset(head,-1,sizeof(head));
nEdge=-1;
S=0,T=n+m+1;
int sum1=0,sum2=0,w;
for(int i=1; i<=n; ++i)
{
scanf("%d",&w);
sum1+=w;
addedge(S,i,w);
for(int j=1; j<=m; ++j)
addedge(i,j+n,K);
}
for(int i=1; i<=m; ++i)
{
scanf("%d",&w);
sum2+=w;
addedge(i+n,T,w);
}
if(sum1!=sum2) printf("Impossible\n");
else
{
int flow=0;
while(bfs())flow+=DFS(S,inf);
if(flow!=sum1) printf("Impossible\n");
else
{
memset(vis,0,sizeof(vis));
bool flag=false;
for(int i=1; i<=n; ++i)
{
if(dfs(i,-1))
{
flag=true;
break;
}
}
if(flag) printf("Not Unique\n");
else ptmat();
}
}
}
return 0;
}
【2014 Multi-University Training Contest 3 1002】/【HDU 4888】 Redraw Beautiful Drawings的更多相关文章
- HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)
Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】
传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...
- 2018 Multi-University Training Contest 1 Distinct Values 【贪心 + set】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6301 Distinct Values Time Limit: 4000/2000 MS (Java/Ot ...
- HDU 2018 Multi-University Training Contest 1 Triangle Partition 【YY】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6300 Triangle Partition Time Limit: 2000/1000 MS (Java ...
- HDU 6351.Beautiful Now-暴力、全排列、思维 (2018 Multi-University Training Contest 5 1002)
2018 Multi-University Training Contest 5 6351.Beautiful Now 题意就是交换任意两个数字,问你交换k次之后的最小值和最大值. 官方题解: 哇塞, ...
- HDU 6333.Problem B. Harvest of Apples-组合数C(n,0)到C(n,m)求和-组合数学(逆元)+莫队 ((2018 Multi-University Training Contest 4 1002))
2018 Multi-University Training Contest 4 6333.Problem B. Harvest of Apples 题意很好懂,就是组合数求和. 官方题解: 我来叨叨 ...
- 【HDU 2014 Multi-University Training Contest 1 1002】/【HDU 4862】Jump
多校训练就这么华丽丽的到了 ,于是乎各种华丽丽的被虐也開始了. 这是多校的1002; 最小费用最大流. 题目大意: 有n*m个方格,每一个方格都一个的十进制一位的数.你能够操作K次. 对于每一次操作, ...
- 【2014 Multi-University Training Contest 2 1002】/【HDU 4873】 ZCC Loves Intersection
果然,或滥用零件,啥都不说了.我们欣慰地学习阅读.这两天残疾儿童是数学. 这是求所需的问题,不明确.贴上官方的解题报告. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi ...
- 2015 Multi-University Training Contest 2 1002 Buildings
Buildings Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5301 Mean: n*m列的网格,删除一个格子x,y,用矩形 ...
随机推荐
- hdu1569find the safest road(floyd变形求最大安全值)
find the safest road Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- innerHTML与appendChild(newnodeText)的区别
innerHTML和createTextNode都可以把一段内容添加到一个节点中,区别是如果这段内容中有html标签时表现就不同了,在createTextNode中会当作文本处理,不会被浏览器解析,但 ...
- Linux下select, poll和epoll IO模型的详解
http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll 介绍 Epoll 可是当前在 Linux 下开发大规模并发网络程序的热 ...
- (76) Clojure: Why would someone learn Clojure? - Quora
(76) Clojure: Why would someone learn Clojure? - Quora ★ Why would someone learn Clojure? Edit
- html5实现拖拽文件上传
以下是自学it网--中级班上课笔记 网址:www.zixue.it html文件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict ...
- Selenium: 空指针error
Error 类型:空指针 可能原因一: 只是引用了该类,但是没有对该类进行实例化(即没有New 一下),即没有给该类分配内存,所以导致空指针: 类调用前注意要实例化,否则会导致空指针错误. 首先声明D ...
- [置顶] C++为什么是C++而不是++C
来自<C++ primer> 问:C++为什么是C++而不是++C 答 :C++之名是Rick Mascitti在1983年夏天定名,c说明它的本质实在C语言演化而来的,”++“是C语言的 ...
- [Backbone]Make Backbone Better With Extensions
Backbone is becoming wildly popular as a web application development framework. Along with this popu ...
- PSD 学位涵义 Poor, Smart and Deep desire to become rich 的缩写,不是真正的学位认证,是对一种心理状态的形容,所谓PSD学位是形容那些贫穷,但是很聪明,很深…_●.×
PSD 学位涵义 Poor, Smart and Deep desire to become rich 的缩写,不是真正的学位认证,是对一种心理状态的形容,所谓PSD学位是形容那些贫穷,但是很聪明,很 ...
- poj1947(树形dp)
题目链接:http://poj.org/problem?id=1947 题意:给n(n<=150)个点的一棵树,求删掉最少边数k使得最后该树只剩下p(1<=p<=n)个节点.(求最小 ...