不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的更多相关文章

  1. 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 ...

  2. 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】

    传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...

  3. 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 ...

  4. 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 ...

  5. HDU 6351.Beautiful Now-暴力、全排列、思维 (2018 Multi-University Training Contest 5 1002)

    2018 Multi-University Training Contest 5 6351.Beautiful Now 题意就是交换任意两个数字,问你交换k次之后的最小值和最大值. 官方题解: 哇塞, ...

  6. 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 题意很好懂,就是组合数求和. 官方题解: 我来叨叨 ...

  7. 【HDU 2014 Multi-University Training Contest 1 1002】/【HDU 4862】Jump

    多校训练就这么华丽丽的到了 ,于是乎各种华丽丽的被虐也開始了. 这是多校的1002; 最小费用最大流. 题目大意: 有n*m个方格,每一个方格都一个的十进制一位的数.你能够操作K次. 对于每一次操作, ...

  8. 【2014 Multi-University Training Contest 2 1002】/【HDU 4873】 ZCC Loves Intersection

    果然,或滥用零件,啥都不说了.我们欣慰地学习阅读.这两天残疾儿童是数学. 这是求所需的问题,不明确.贴上官方的解题报告. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi ...

  9. 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,用矩形 ...

随机推荐

  1. MVP模式在Android开发中的应用

    一.MVP介绍      随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互.同一 ...

  2. VirtualBox,Kernel driver not installed (rc=-1908)

    http://hi.baidu.com/spt_form/item/316d6207b47b8ee03499020a VirtualBox,Kernel driver not installed (r ...

  3. phpc.sinaapp.com 加密的解密方法

    原文:phpc.sinaapp.com 加密的解密方法 很简单,用类似phpjm的解密方式,替换掉_inc.php中最后一个return中的eval为print就出来了.

  4. 使用Ajax以及Jquery.form异步上传图片

    一.前言 之前做图片上传一直用的第三方插件,Uploadify  这个应该是用的比較多的,相同也用过别的,在方便了自己的同一时候也非常赞叹人家的功能. 思来想去,仅仅会用别的人东西,始终自己学到的少, ...

  5. C++ 多态性分析

    编译 - 时间多态性--函数重载 编译后的中间代码(例如GCC产生.o文件.此时还不是汇编语言)函数名字有变化,看以下两个样例. void cc_show(const char*str)     -& ...

  6. VSTO 学习笔记(十三)谈谈VSTO项目的部署

    原文:VSTO 学习笔记(十三)谈谈VSTO项目的部署 一般客户计算机专业水平不高,但是有一些Office水平相当了得,尤其对Excel的操作非常熟练.因此如果能将产品的一些功能集成在Office中, ...

  7. IE, FireFox, Opera 浏览器支持CSS实现Alpha透明的方法 兼容问题

    一:要解决的问题时:在ie6-ie11下兼容下面透明上传文件button的效果. 实现方式通过滤镜实现. 二:效果图例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3N ...

  8. 已知直线上的两点 A(x1, y1), B(x2, y2) 和另外一点 C(x0, y0),求C点到直线的距离。

    数学知识太差,一点点积累,高手勿喷. 1. 先求出AB向量 a = ( x2-x1, y2-y1 ) 2. 求AB向量的单位方向向量 b = √((x2-x1)^2 + (y2-y1)^2)) a1 ...

  9. Windown安装Mysql安装图解

    一.MYSQL的安装 1.打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行“setup.exe”. 2.选择安装类型,有“Typical(默认)”.“Comp ...

  10. Java集群--大型网站是怎样解决多用户高并发访问的

    时间过得真快,再次登录博客园来写博,才发现距离上次的写博时间已经过去了一个月了,虽然是因为自己找了实习,但这也说明自己对时间的掌控能力还是没那么的强,哈哈,看来还需不断的努力啊!(这里得特别说明一下本 ...