Graph Reconstruction


Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge

Let there be a simple graph with N vertices but we just know the degree of each vertex. Is it possible to reconstruct the graph only by these information?

A simple graph is an undirected graph that has no loops (edges connected at both ends to the same vertex) and no more than one edge between any two different vertices. The degree of a vertex is the number of edges that connect to it.

Input

There are multiple cases. Each case contains two lines. The first line contains one integer N (2 ≤ N ≤ 100), the number of vertices in the graph. The second line conrains N integers in which the ith item is the degree of ith vertex and each degree is between 0 and N-1(inclusive).

Output

If the graph can be uniquely determined by the vertex degree information, output "UNIQUE" in the first line. Then output the graph.

If there are two or more different graphs can induce the same degree for all vertices, output "MULTIPLE" in the first line. Then output two different graphs in the following lines to proof.

If the vertex degree sequence cannot deduced any graph, just output "IMPOSSIBLE".

The output format of graph is as follows:

N E
u

1

 u

2

 ... u

E

v

1

 v

2

 ... v

EWhere N is the number of vertices and E is the number of edges, and {ui,vi} is the ith edge the the graph. The order of edges and the order of vertices in the edge representation is not important since we would use special judge to verify your answer. The number of each vertex is labeled from 1 to N. See sample output for more detail.

Sample Input

1
0
6
5 5 5 4 4 3
6
5 4 4 4 4 3
6
3 4 3 1 2 0

Sample Output

UNIQUE
1 0 UNIQUE
6 13
3 3 3 3 3 2 2 2 2 1 1 1 5
2 1 5 4 6 1 5 4 6 5 4 6 4
MULTIPLE
6 12
1 1 1 1 1 5 5 5 6 6 2 2
5 4 3 2 6 4 3 2 4 3 4 3
6 12
1 1 1 1 1 5 5 5 6 6 3 3
5 4 3 2 6 4 3 2 4 2 4 2
IMPOSSIBLE 思路:这是一道坑题.......坑在格式的就不说了,可以原谅oj.如果hdu4797交不过,去zoj3732就能过了,(因为不能specail judge纯oj问题).
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=111;
int sum,n;
typedef pair<int ,int > P;
P deg[maxn];
P tmpdeg[maxn];
int ash1[maxn*maxn*2],ash2[maxn*maxn*2],alen; bool cmp(P A,P B)
{
if(A.first==B.first) return A.second<B.second;
return A.first>B.first;
}
void prints(){
printf("%d %d\n",n,sum>>1); if(alen>0)printf("%d",ash1[0]);
for(int i=1;i<alen;i++){
printf(" %d",ash1[i]);
}
puts("");
if(alen>0)printf("%d",ash2[0]);
for(int i=1;i<alen;i++){
printf(" %d",ash2[i]);
}
puts("");
} void cpy(){
for(int i=0;i<n;i++)tmpdeg[i]=deg[i];
sort(tmpdeg,tmpdeg+n,cmp);
} bool single;
bool rebuild(){
cpy();
alen=0;
single=true;
for(;tmpdeg[0].first>0;){
int amount=0;
for(int j=1;j<n;j++){
if(tmpdeg[j].first>0){
amount++;
}
}
if(amount<tmpdeg[0].first)return false;
if(single&&(tmpdeg[tmpdeg[0].first].first)==(tmpdeg[tmpdeg[0].first+1].first)&&tmpdeg[0].first+1<n){
single=false;
}
for(int j=1;j<=tmpdeg[0].first;j++){
tmpdeg[j].first--;
ash1[alen]=tmpdeg[0].second;
ash2[alen++]=tmpdeg[j].second;
} tmpdeg[0].first=0;
sort(tmpdeg,tmpdeg+n,cmp);
}
return true;
} bool rebuild2(){
cpy();
alen=0;
for(;tmpdeg[0].first>0;){
int amount=0;
for(int j=1;j<n;j++){
if(tmpdeg[j].first>0){
amount++;
}
}
if(amount<tmpdeg[0].first)return false;
if((tmpdeg[tmpdeg[0].first].first)==(tmpdeg[tmpdeg[0].first+1].first)&&tmpdeg[0].first+1<n){
swap(tmpdeg[tmpdeg[0].first].second,tmpdeg[tmpdeg[0].first+1].second);
}
for(int j=1;j<=tmpdeg[0].first;j++){
tmpdeg[j].first--;
ash1[alen]=tmpdeg[0].second;
ash2[alen++]=tmpdeg[j].second;
}
tmpdeg[0].first=0;
sort(tmpdeg,tmpdeg+n,cmp);
}
return true;
} int main(){
while(scanf("%d",&n)==1){
bool failed =false;
for(int i=1;i<=n;i++){
scanf("%d",&(deg[i-1].first));
deg[i-1].second=i;
if(deg[i-1].first<0)failed=true;
}
sort(deg,deg+n,cmp);
sum=0;
for(int i=0;i<n;i++){
if(deg[i].first>=n)failed=true;
sum+=deg[i].first;
}
if(sum&1)failed=true;
if(failed||!rebuild()){
puts("IMPOSSIBLE");
}
else if(single){
puts("UNIQUE");
prints();
}
else {
puts("MULTIPLE");
prints();
rebuild2();
prints();
}
}
return 0;
}

  

zoj3732&& hdu4797 Graph Reconstruction的更多相关文章

  1. 2013长沙 G Graph Reconstruction (Havel-Hakimi定理)

    Graph Reconstruction Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge Let there ...

  2. Codeforces Round #192 (Div. 1) C. Graph Reconstruction 随机化

    C. Graph Reconstruction Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/3 ...

  3. 2013亚洲区域赛长沙站 ZOJ 3732 Graph Reconstruction

    题目链接 Graph Reconstruction 题意 给你无向图每个点的度数, 问是否存在唯一解, 存在输出唯一解, 多解输出两个, 无解输出IMPOSSIBLE 思路 这里用到了 Havel-H ...

  4. ZOJ3732 Graph Reconstruction Havel-Hakimi定理

    分析: 给定一个非负整数序列{dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化. 进一步,若图为简单图,则称此序列可简单图化 (来自百度百科) 可简单图化的判定可以用Have ...

  5. CodeForces-329C(div1):Graph Reconstruction(随机&构造)

    I have an undirected graph consisting of n nodes, numbered 1 through n. Each node has at most two in ...

  6. CF 329C(Graph Reconstruction-随机化求解-random_shuffle(a+1,a+1+n))

    C. Graph Reconstruction time limit per test 3 seconds memory limit per test 256 megabytes input stan ...

  7. 论文解读(SEP)《Structural Entropy Guided Graph Hierarchical Pooling》

    论文信息 论文标题:Structural Entropy Guided Graph Hierarchical Pooling论文作者:Junran Wu, Xueyuan Chen, Ke Xu, S ...

  8. CF-192-diy-2

    题目链接: http://codeforces.com/contest/330 A. Cakeminator 题目意思: 给一个r*c的矩阵方格,有些位置有S,如果某一行和一列都不含标记为S的方格,则 ...

  9. 2018省赛赛第一次训练题解和ac代码

    第一次就去拉了点思维很神奇的CF题目 2018省赛赛第一次训练 # Origin Title     A CodeForces 607A Chain Reaction     B CodeForces ...

随机推荐

  1. 如何安装多个jdk

    1.首先去官网下载不同版本的jdk 下载地址:http://www.oracle.com/technetwork/java/javase/archive-139210.html 2.下载后我的安装路径 ...

  2. NOIP模拟题 2017.7.3 - 模拟 - 贪心 - 记忆化搜索

    直接暴力模拟,注意判数据结构为空时的取出操作. Code #include<iostream> #include<cstdio> #include<ctime> # ...

  3. UVa 11082 Matrix Decompressing - 网络流

    开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且 ...

  4. Metasploit应用举例

    本篇文章包含以下几方面内容: 1.Metasploit端口扫描: 2.用其他模块 3.metasploit smb获取系统信息 4.Metsploit服务识别 5.ftp识别: 6.metasploi ...

  5. UVA 11806 Cheerleaders (容斥原理

    1.题意描述 本题大致意思是讲:给定一个广场,把它分为M行N列的正方形小框.现在给定有K个拉拉队员,每一个拉拉队员需要站在小框内进行表演.但是表演过程中有如下要求: (1)每一个小框只能站立一个拉拉队 ...

  6. MYSQL语句:创建、授权、查询、修改、统计分析等 一 用户的创建、权限设置、删除等

    MYSQL语句:创建.授权.查询.修改.统计分析.. 一.用户的创建.权限设置.删除等 1.首先链接MySQL操作 连接格式:mysql -h 主机地址 -u 用户名 -p 用户密码 (注-u与roo ...

  7. bzoj 1483: [HNOI2009]梦幻布丁 启发式合并vector

    1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description N个 ...

  8. python里的apply,applymap和map的区别

    apply,applymap和map的应用总结: apply 用在dataframe上,用于对row或者column进行计算: applymap 用于dataframe上,是元素级别的操作: map  ...

  9. 《F4+2团队项目需求改进与系统设计》

    任务一 a.分析<动态的太阳系模型项目需求规格说明书>初稿的不足. 任务概述描述的有些不具体,功能的规定不详细,在此次作业进行了修改. b.参考<构建之法>8.5节功能的定位和 ...

  10. 难部署的taiga,式微的circus——趋势从进程管理到容器管理,简单才是美

    一直需要一个项目管理系统,一直没时间弄. taiga是github上搜project management star最多的项目,又是基于django用python写的后端,所以就用它: 但是,集中精力 ...