HDU 4888

HDU 4888

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

Redraw Beautiful Drawings

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1993    Accepted Submission(s): 446

Problem Description
Alice and Bob are playing together. Alice is crazy about art and she has visited many museums around the world. She has a good memory and she can remember all drawings she has seen.

Today Alice designs a game using these drawings in her memory. First, she matches K+1 colors appears in the picture to K+1 different integers(from 0 to K). After that, she slices the drawing into grids and there are N rows and M columns. Each grid has an integer on it(from 0 to K) representing the color on the corresponding position in the original drawing. Alice wants to share the wonderful drawings with Bob and she tells Bob the size of the drawing, the number of different colors, and the sum of integers on each row and each column. Bob has to redraw the drawing with Alice’s information. Unfortunately, somtimes, the information Alice offers is wrong because of Alice’s poor math. And sometimes, Bob can work out multiple different drawings using the information Alice provides. Bob gets confused and he needs your help. You have to tell Bob if Alice’s information is right and if her information is right you should also tell Bob whether he can get a unique drawing.

 

Input
The input contains mutiple testcases.

For each testcase, the first line contains three integers N(1 ≤ N ≤ 400) , M(1 ≤ M ≤ 400) and K(1 ≤ K ≤ 40).

N integers are given in the second line representing the sum of N rows.

M integers are given in the third line representing the sum of M columns.

The input is terminated by EOF.

 

Output
For each testcase, if there is no solution for Bob, output “Impossible” in one line(without the quotation mark); if there is only one solution for Bob, output “Unique” in one line(without the quotation mark) and output an N * M matrix in the following N lines representing Bob’s unique solution; if there are many ways for Bob to redraw the drawing, output “Not Unique” in one line(without the quotation mark).
 

Sample Input
   
   
2 2 4 4 2 4 2 4 2 2 2 2 5 0 5 4 1 4 3 9 1 2 3 3

 

Sample Output
   
   
Not Unique Impossible Unique 1 2 3 3

 

Author
Fudan University
 

Source

已知一个矩阵,n行m列。已知每一行,每一列的和,推断是否存在这种矩阵,而且推断是否唯一。

非常裸的最大流模型,前面的部分非常水,关键是,最大流判环部分有点纠结。

代码:

/* ***********************************************
Author :rabbit
Created Time :2014/8/4 18:18:37
File Name :11.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
const int maxn=20100;
const int maxm=1002000;
struct Edge{
	int next,to,cap;
	Edge(){};
	Edge(int _next,int _to,int _cap){
		next=_next;to=_to;cap=_cap;
	}
}edge[maxm];
int head[maxn],tol,dep[maxn],gap[maxn];
void addedge(int u,int v,int flow){
    edge[tol]=Edge(head[u],v,flow);head[u]=tol++;
    edge[tol]=Edge(head[v],u,0);head[v]=tol++;
}
void bfs(int start,int end){
    memset(dep,-1,sizeof(dep));
    memset(gap,0,sizeof(gap));
    gap[0]++;int front=0,rear=0,Q[maxn];
    dep[end]=0;Q[rear++]=end;
    while(front!=rear){
        int u=Q[front++];
        for(int i=head[u];i!=-1;i=edge[i].next){
            int v=edge[i].to;if(dep[v]==-1)
                Q[rear++]=v,dep[v]=dep[u]+1,gap[dep[v]]++;
        }
    }
}
int cur[maxn],S[maxn];
int sap(int s,int t,int N){
	int res=0;bfs(s,t);
	int top=0,u=s,i;
	memcpy(cur,head,sizeof(head));
	while(dep[s]<N){
		if(u==t){
			int temp=INF,id;
		    for( i=0;i<top;i++)
			   if(temp>edge[S[i]].cap)
				   temp=edge[S[i]].cap,id=i;
		    for( i=0;i<top;i++)
			      edge[S[i]].cap-=temp,edge[S[i]^1].cap+=temp;
		    res+=temp;top=id;u=edge[S[top]^1].to;
		}
		if(u!=t&&gap[dep[u]-1]==0)break;
		for( i=cur[u];i!=-1;i=edge[i].next)
			if(edge[i].cap&&dep[u]==dep[edge[i].to]+1)break;
		if(i!=-1)cur[u]=i,S[top++]=i,u=edge[i].to;
		else{
			int MIN=N;
			for( i=head[u];i!=-1;i=edge[i].next)
				if(edge[i].cap&&MIN>dep[edge[i].to])
					MIN=dep[edge[i].to],cur[u]=i;
			--gap[dep[u]];++gap[dep[u]=MIN+1];
			if(u!=s)u=edge[S[--top]^1].to;
		}
	}
	return res;
}
int hang[500],lie[500];
int flow[500][500],vis[maxn],m,n,k;
bool dfs(int u,int fa){
	if(vis[u])return 1;
	vis[u]=1;
	for(int i=head[u];i!=-1;i=edge[i].next){
		int v=edge[i].to;
		if(v==fa||v==0||v==n+m+1||edge[i].cap==0)continue;
		if(dfs(v,u))return 1;
	}
	vis[u]=0;
	return 0;
}
int main()
{
     freopen("1002.in","r",stdin);
     freopen("data.out","w",stdout);
	 while(~scanf("%d%d%d",&n,&m,&k)){
		 memset(head,-1,sizeof(head));tol=0;
		 int L=0,R=0;
		 for(int i=1;i<=n;i++)scanf("%d",&hang[i]),L+=hang[i];
		 for(int i=1;i<=m;i++)scanf("%d",&lie[i]),R+=lie[i];
		 if(L!=R){
			 puts("Impossible");continue;
		 }
		 for(int i=1;i<=n;i++)
			 addedge(0,i,hang[i]);
		 for(int i=1;i<=m;i++)
			 addedge(i+n,n+m+1,lie[i]);
		 for(int i=1;i<=n;i++)
			 for(int j=n+1;j<=n+m;j++)
				 addedge(i,j,k);
		 int ans=sap(0,n+m+1,m+n+100);
		 if(ans!=L){
			 puts("Impossible");continue;
		 }
		 int flag=0;
		 memset(vis,0,sizeof(vis));
		 for(int i=1;i<=n;i++)
			 if(dfs(i,-1)){
				 flag=1;break;
			 }
		 if(flag)puts("Not Unique");
		 else {
			 puts("Unique");
			 for(int i=1;i<=n;i++)
				 for(int j=head[i];j!=-1;j=edge[j].next){
					 int v=edge[j].to;
					 if(v>n&&v<=n+m)
						 flow[i][v-n]=k-edge[j].cap;
				 }
			 for(int i=1;i<=n;i++){
				 printf("%d",flow[i][1]);
				 for(int j=2;j<=m;j++)
					 printf(" %d",flow[i][j]);
				 puts("");
			 }
		 }
	 }
     return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118593.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 区块链:P2P技术是什么

    区块链:P2P技术是什么摘要:包括比特币、以太坊等在内的去中心化的区块链平台,其底层网络都是采用的P2P技术实现,每个节点都是对等的。而本文,则先通过介绍P2P技术的特点和发展历史,让大家对P2P这个技术的来龙去脉有一个初步的认识和了解。然后在下一篇文章中,我会详细介绍第三代P2P技术(DHT)—Kademlia算法的实现原理。1.p2p的定义P2P是peer-to-peer的简称,又称为点对点技…

    2022年6月19日
  • outputstream转byte数组_byte数组写入文件

    outputstream转byte数组_byte数组写入文件将inputstream转化为数组byte[]

    2022年9月21日
  • sublimetext3没有package control_mvn install

    sublimetext3没有package control_mvn installsublime3 Package Control: install Package 超时

    2022年4月21日
  • QQ图片制作跳转_我要自己制作头像

    QQ图片制作跳转_我要自己制作头像QQ图片跳转加群QQ群里看到一个好像视频的图片,点开却变成一个加群的链接,直接到了这是QQ里的一种插件,类似QQ群机器人,只不过现在很难能找到了,去年有段时间很火,使用插件生成以后发到群内或者QQ聊天内,可以自定义图片和超链接,点击可以跳转图片只是一个预览而已,因为现在的扣扣发网址会自动加载页面的内容预览出来就是一个图片,这个图片是网站制作人员事先设置好的,类似文档的预览图也就是脸面。比如你你发一个加群的链接到群里,然后系统自动加载网页,顺便脸面图片也显示出来了。你点击图片后当然就跳转到加群

    2022年8月10日
  • C#的一些关键字的总结

    C#的一些关键字的总结

    2021年7月27日
  • Win10 桌面美化

    Win10 桌面美化Win10桌面美化最近发现了几款Win10界面美化的软件,看了看别人家的Win10操作界面,瞬间觉得自己的low了,关键是赏心悦目啊!废话不多说,先看看我原来桌面和美化后的桌面对比图原始桌面美化桌面1.安装RocketDockRocketDock可以提供类似macos的操作系统图标特效,打开安装包进行安装,完毕后启动得到效果如下:可以发现切换效果与mac类似,他默认的主题是C…

    2022年4月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号