2013亚洲区域赛长沙站 ZOJ 3732 Graph Reconstruction
题目链接
题意
给你无向图每个点的度数, 问是否存在唯一解, 存在输出唯一解, 多解输出两个, 无解输出IMPOSSIBLE
思路
这里用到了 Havel-Hakimi定理, 实际上就是按照度数构图的一种贪心策略. 这样能判断出来一个解或无解, 多解的情况, 只要在比较构图时最后面两个点的当前度数一样, 那么选其一都是可行的, 但是选其一的情况有保证了另外一个肯定没有连上, 所以能找到其它解.
代码
#include <bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
#define eps 1e-8
using namespace std;
struct Node{
int val, pos;
}d[105], b[105];
pair<int, int> res1[10005], res2[10005];
int cnt1, cnt2;
bool compare(Node x, Node y){
return x.val > y.val;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif // ONLINE_JUDGE
int n;
while (~scanf("%d", &n)){
bool noans = false;
cnt1 = cnt2 = 0;
for (int i = 1; i <= n; i++){
scanf("%d", &d[i].val);
d[i].pos = i;
if (d[i].val > n - 1) noans = true;
b[i] = d[i];
}
sort(d + 1, d + n + 1, compare);
bool isunique = true;
while (!noans){
if (d[1].val == 0) break;
for (int i = 2; i < 2 + d[1].val; i++){
d[i].val--;
res1[cnt1++] = make_pair(d[1].pos, d[i].pos);
if (d[i].val < 0){
noans = true;
break;
}
}
if (d[2 + d[1].val].val - d[1 + d[1].val].val == 1){
isunique = false;
}
d[1].val = 0;
sort(d + 1, d + n + 1, compare);
}
if (noans){
printf("IMPOSSIBLE\n");
continue;
}
if (isunique){
printf("UNIQUE\n");
}
else{
printf("MULTIPLE\n");
for (int i = 1; i <= n; i++){
d[i] = b[i];
}
sort(d + 1, d + n + 1, compare);
bool first = true;
while (d[1].val != 0){
for (int i = 2; i < 1 + d[1].val; i++){
d[i].val--;
res2[cnt2++] = make_pair(d[1].pos, d[i].pos);
}
if (first && d[1 + d[1].val].val == d[2 + d[1].val].val){
first = false;
d[2 + d[1].val].val--;
res2[cnt2++] = make_pair(d[1].pos, d[2 + d[1].val].pos);
}
else{
d[1 + d[1].val].val--;
res2[cnt2++] = make_pair(d[1].pos, d[1 + d[1].val].pos);
}
d[1].val = 0;
sort(d + 1, d + n + 1, compare);
}
}
printf("%d %d\n", n, cnt1);
for (int i = 0; i < cnt1; i++){
printf("%d ", res1[i].first);
}
printf("\n");
for (int i = 0; i < cnt1; i++){
printf("%d ", res1[i].second);
}
printf("\n");
if (!isunique){
printf("%d %d\n", n, cnt2);
for (int i = 0; i < cnt2; i++){
printf("%d ", res2[i].first);
}
printf("\n");
for (int i = 0; i < cnt2; i++){
printf("%d ", res2[i].second);
}
printf("\n");
}
}
}
2013亚洲区域赛长沙站 ZOJ 3732 Graph Reconstruction的更多相关文章
- 2013 ACM区域赛长沙 H zoj 3733 (hdu 4798) Skycity
题意:一个圆台,底面和顶面半径分别为R,r,然后高度为H,一共F层,每层高度一样,然后要在每层的天花板上贴方格玻璃,方格玻璃要满足以下几个条件: 方格玻璃面积不能小于S,且方格玻璃要围成一个正多边形, ...
- 2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem
2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem 题意: 给定一个长度为\(n\)的序列,有两种操作: 1:单点修改. 2:查询区间\([L,R]\)范围内所有子 ...
- 2014ACM/ICPC亚洲区域赛牡丹江站汇总
球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...
- ACM-ICPC 2016亚洲区域赛(沈阳站)游记(滚粗记)
首发于QQ空间和知乎,我在这里也更一下. 前言 以前高中搞竞赛的时候,经常看到神犇出去比赛或者训练之后写游记什么的,感觉萌萌哒.但是由于太弱,就没什么心情好写.现在虽然还是很弱,但是抱着享受的心情 ...
- 第42届亚洲区域赛青岛站(2017icpc青岛)经验总结以及一些感想
上一次写这种东西还是天梯赛,当时打完心里也是挺激动的,然后我们队也没有去参加省赛,但是过了一段时间我还是从那里面恢复了出来.因为我当时确实还是很菜的,当时连个暴力都不会,看着自己仅过的那些百度的题目确 ...
- 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-A ( ZOJ 3819 ) Average Score
Average Score Time Limit: 2 Seconds Memory Limit: 65536 KB Bob is a freshman in Marjar Universi ...
- 2013 ACM-ICPC亚洲区域赛南京站C题 题解 轮廓线DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4804 题目大意 给你一个 \(n \times m\) 的矩形区域.你需要用 \(1 \times 1 ...
- 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-K ( ZOJ 3829 ) Known Notation
Known Notation Time Limit: 2 Seconds Memory Limit: 65536 KB Do you know reverse Polish notation ...
- 【2013 ICPC亚洲区域赛成都站 F】Fibonacci Tree(最小生成树+思维)
Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do s ...
随机推荐
- bzoj1816: [Cqoi2010]扑克牌(二分答案判断)
1816: [Cqoi2010]扑克牌 题目:传送门 题解: 被一道毒瘤题搞残了...弃了坑来刷刷水题 一开始还想复杂了...结果发现二分水过: 二分答案...然后check一下,joker肯定尽量用 ...
- Linux下处理JSON的命令行工具:jq---安装
转自:https://blog.csdn.net/Sunny_much/article/details/50668871 JSON是前端编程经常用到的格式.Linux下也有处理处理JSON的 ...
- [JZOJ 5908] [NOIP2018模拟10.16] 开荒(kaihuang)解题报告 (树状数组+思维)
题目链接: https://jzoj.net/senior/#contest/show/2529/1 题目: 题目背景:尊者神高达作为一个萌新,在升级路上死亡无数次后被一只大黄叽带回了师门.他加入师门 ...
- 关于如何让cell一直保持选中?
在M上 1.cell的展示,一直都是依靠数据源的支持.所以,必须要在数据源里面新增bool,默认为false 在V上 2.cell的setModel方法里面,将数据源的新增bool赋值为cell的是否 ...
- Swift学习笔记(7):函数
目录: 函数参数与返回值 参数标签和参数名称 可变参数 传入传出参数 函数类型 嵌套函数 函数是一段完成特定任务的独立代码片段,使用func标示函数名,使用->标示返回类型. ・可以为函数参数设 ...
- MyBatis数据持久化(六)resultMap使用
resultMap是MyBatis最强大也是最重要的特性,使用它我们可以將查询结果或者sql输入条件和一个HashMap的key进行映射,大大简化了sql查询条件的输入,而且使得数据的查询变得非常灵活 ...
- 函数式编程-只用"表达式",不用"语句"()
把函数当作普通的运算符使用. 2. 只用"表达式",不用"语句"() "表达式"(expression)是一个单纯的运算过程,总是有返回值: ...
- Github上值得关注的前端项目-转自好友trigkit4
http://microjs.com/# 该网站的资源都托管到了github,microjs.com是一个可以让你选择微型的js类库的网站,该网站里的js库都是压缩后不大于5KB的,非常实用 http ...
- 洛谷 P1967 货车运输 LCA + 最小生成树
两点之间边权最大值的最小值一定在图的最小生成树中取到. 求出最小生成树,进行倍增即可. Code: #include<cstdio> #include<algorithm> u ...
- P1064 金明的预算方案 (依赖性背包问题)
这道题可以用分组背包来做. 但是分组有两种方式 一种是把主件,主件+附件1,主件+附件2分成一组 组内只能选一个物品 一种是建一颗树,用树形dp的方式去做 第二种更通用,就算物品的依赖关系是森林都可以 ...