【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,用矩形 ...
随机推荐
- 如何利用Win32API取得另一支程式中的ListView內的所有值(RegisterHotKey,ReadProcessMemory,WindowFromPoint和VirtualAllocEx)
http://blog.csdn.net/shuaihj/article/details/6129506
- Android服务之PackageManagerService启动源码分析
了解了Android系统的启动过程的读者应该知道,Android的所有Java服务都是通过SystemServer进程启动的,并且驻留在SystemServer进程中.SystemServer进程在启 ...
- C语言之基本算法35—数组上三角之积 主对角之积 副对角之积
//数组算法 /* ============================================================= 题目:求四阶矩阵上三角之积.主对角之积,副对角之积: 如 ...
- [翻译]利用C#获取终端服务(Terminal Services)会话的闲置时间
[翻译]利用C#获取终端服务(Terminal Services)会话的闲置时间 作者:Tuuzed(土仔) 发表于:2008年2月29日版权声明:可以任意转载,转载时请务必以超链接形式标明文章原 ...
- Selenium来抓取动态加载的页面
一般的爬虫都是直接使用http协议,下载指定url的html内容,并对内容进行分析和抽取.在我写的爬虫框架webmagic里也使用了HttpClient来完成这样的任务. 但是有些页面是通过js以及a ...
- PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具 - 开源中国社区
PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具 - 开源中国社区 PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具
- hdu 2838 Cow Sorting(树状数组)
Cow Sorting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Session为空的一种原因
在维护一份比较老的代码,想改为ajax调用,然后就添加了一个一般处理程序文件,也就是以.ashx结尾的文件,一切都正常,但发现session一直为空,很奇怪 基本的代码如下: public class ...
- 在Windows下使用Hexo+GithubPage搭建博客的过程
1.安装Node.js 下载地址:传送门 去 node.js 官网下载相应版本,进行安装即可. 可以通过node -v的命令来测试NodeJS是否安装成功 2.安装Git 下载地址:传送门 去 Git ...
- 开放源代码的微微信.NET 0.8 版公布了
微微信.NET 0.8 版公布了 A.源代码应用范围: 未认证的和经过认证的微信订阅号.微信服务号均可使用,本源代码的每个模块都提供全然的 ASP.NET C#源代码,绝对不含 ...