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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue上传文件流

    vue上传文件流创建formData方法,把文件流以及所有需要上传的数据通过formData.append传入formData中,上传请求中的data中只需要放一个formData就可以了。(此处request为封装的请求方法,省事可以不封装)

    2022年10月16日
    2
  • SQL Server 2017下载,安装,打开步骤「建议收藏」

    vSQLServer2017下载内容分为两部分SQLServer2017 Developer和SQLserverMamngementStudio第一部分:1.官网下载SQLServer2017Developer      https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads2….

    2022年4月10日
    373
  • uart接口是什么_各种接口的详细介绍

    uart接口是什么_各种接口的详细介绍我面试的时候一般喜欢问应聘者一个问题:UART与RS232/RS485的区别与联系?很多人对于这个问题答得都不是很好。还有些人压根就没有想过这个问题,一直认为他们是同一个东西,就是咱们俗称的串口。我刚入嵌入式的大门时,对这个问题也困惑过很久,后来终于弄明白了。跟大家一起分享一下吧。简单来说,区别在于UART是一种接口,而RS232/RS485是一种总线。UART这个接口,后面可以接TTL电平,这就是我们俗称的普通的串口。而UART如果接了RS232/RS485的转换芯片,那么后面的总线上..

    2025年11月16日
    3
  • Idea中的war和war explore有什么区别

    Idea中的war和war explore有什么区别我们发布项目时选择war还是war explore:war模式:将web工程以war包的形式上传到服务器 war exploed模式:将web工程以当前文件夹的位置关系上传到服务器war模式:先打成war包,然后再发布到Tomcat的ROOT下,所以选择这个后,你再看下你的tomcat的root文件夹下,是刚打成的项目war exploded模式:只编译,生成target;然后把当…

    2022年6月13日
    84
  • silverlight 跳转指定的aspx页面

    silverlight 跳转指定的aspx页面

    2021年8月29日
    55
  • Matlab绘图(一二三维)

    Matlab绘图强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,M

    2021年12月22日
    40

发表回复

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

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