【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,用矩形 ...
随机推荐
- nmap -- write a nmap script
漏洞扫描 --编写Nmap脚本 2006年12月份,Nmap4.21 ALPHA1版增加脚本引擎,并将其作为主线代码的一部分.NSE脚本库现在已经有400多个脚本.覆盖了各种不同的网络机制(从SMB漏 ...
- ExtJs4 笔记(6) Ext.MessageBox 消息对话框
本篇演示消息对话框的用法,ExtJs封装了可能用到的各类消息框,并支持自定义的配置. 如下是用到的html: [html] <h1>各种消息框</h1> <div id= ...
- IE6_一些简单bug
1.IE6调整窗口大小的 Bug 当把body居中放置,改变IE浏览器大小的时候,任何在body里面的相对定位元素都会固定不动了.给body定义position:relative;就行了. 2.避免百 ...
- WM_PARENTNOTIFY的作用(不完全)
VCL里源码如下: procedure TWinControl.WMParentNotify(var Message: TWMParentNotify); begin with Message do ...
- lightoj 1297(三分)
传送门:Largest Box 题意:长度为L宽度为W的纸四个角去掉x*x的正方形,然后形成一个长方体,问能组成长方体的最大体积为多少. 分析:三分x求最值. #include <cstdio& ...
- SetCapture ReleaseCapture
函数功能:该函数在属于当前线程的指定窗体里设置鼠标捕获.一旦窗体捕获了鼠标,全部鼠标输入都针对该窗体,不管光标是否在窗体的边界内.同一时刻仅仅能有一个窗体捕获鼠标.假设鼠标光标在还有一个线程创建的窗体 ...
- 设计模式之——Factory(工厂模式)
工厂模式用于,通过统一的创建对象接口来创建对象,而子类可以决定对象的创建方式. class CObject { }; class CCar : public CObject { }; class CF ...
- 我为什么要创建帮创业者找合伙人的缘创派(ycpai.com)?
我为什么要创建帮助创业者找合伙人的缘创派(ycpai.com)? 在我发出第一条离开CSDN出来创业的微博后,感谢各位朋友的鼓励.很多朋友问我一些问题,我在这里一并回答,并简单阐述一下我的理念. 问: ...
- RANSAC - 随机采样一致性算法
RANSAC范例的正式描述如下: 首先,要给定: 1一个模型,该模型需要最少n个数据点去实例化它的自由参数: 2一组数据点P,P中包含数据点的数量#(P)大于n. 然后, 从P中随机地选择n个点(组成 ...
- JavaScript2谁刚开始学习应该知道4最佳实践文章(翻译)
原版的:24 JavaScript Best Practices for Beginners (注:阅读原文的时候没有注意公布日期,觉得不错就翻译了,翻译到JSON.parse那一节觉得有点不正确路才 ...