【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,用矩形 ...
随机推荐
- 【从cocos2d-x学习设计模式】第一阶段:辛格尔顿
设计模式,它总结了前辈在许多方案重用代码.它是一个想法. 因为我们爱cocos2d-x,然后我们从去cocos2d-x在设计模式中,右一起学习!本篇解释未来辛格尔顿. 提cocos2d-x中间Dire ...
- hadoop namanodejava
最近突然想看下hadoop源码,有利于处理一些突发问题.先从name启动开始, NameNode.java public static void main(String argv[]) throws ...
- mormort 土拨鼠,做后端服务那是杠杠的,基于http.sys
http.sys你可以用 mormort 土拨鼠,做后端服务那是杠杠的,基于http.sys并且还是开源的,作者天天更新代码,非常勤奋,官方论坛提问,回答也快其实,稍微看看,就能玩的挺好的
- swift 笔记2
swift交流群:342581988,欢迎增加. 今天真郁闷啊,把mac升级到10.10了.如今好了,曾经的程序都跑不了了.哎,不说了,让我郁闷会再. 说说条件推断吧,事实上这些基本的语法大家都知道肯 ...
- python语言学习4——使用文本编辑器
在Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍. 所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为一个文件,这样, ...
- PhantomJS是一个基于WebKit的服务器端JavaScript API
PhantomJS是一个基于WebKit的服务器端JavaScript API,它基于 BSD开源协议发布.PhantomJS无需浏览器的支持即可实现对Web的支持,且原生支持各种Web标准,如DOM ...
- R12 付款过程请求-功能和技术信息 (文档 ID 1537521.1)
In this Document Abstract History Details _afrLoop=2234450430619177&id=1537521.1&dis ...
- ftk学习记(waitbox篇)
[声明:版权全部.欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面说到了脚本.那么就看看ftk中demo与script搭配的效果是什么样的? 上面的效果图就相 ...
- Java中定时器的使用
import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.T ...
- Python数据结构-字典
tel={,} tel[ print(tel) print(tel['tom']) del tel['tom'] print(tel) print(tel.keys()) 运行结果: {, , } { ...