题目描述 Description###

Graph constructive problems are back! This time the graph you are asked to build should match the following properties.

The graph is connected if and only if there exists a path between every pair of vertices.

The diameter (aka "longest shortest path") of a connected undirected graph is the maximum number of edges in the shortest path between any pair of its vertices.

The degree of a vertex is the number of edges incident to it.

Given a sequence of n integers \(a_1,a_2,…,a_n\) construct a connected undirected graph of n vertices such that:

the graph contains no self-loops and no multiple edges;

the degree di of the \(i\) -th vertex doesn't exceed ai (i.e. \(d_i ≤a_i\) );

the diameter of the graph is maximum possible.

Output the resulting graph or report that no solution exists.

输入描述 Input Description###

The first line contains a single integer n (3≤n≤500) — the number of vertices in the graph.

The second line contains n integers $a_1,a_2,…,a_n $ (\(1≤a_i≤n−1\) ) — the upper limits to vertex degrees.

输出描述 Output Description###

Print "NO" if no graph can be constructed under the given conditions.

Otherwise print "YES" and the diameter of the resulting graph in the first line.

The second line should contain a single integer m — the number of edges in the resulting graph.

The i-th of the next m lines should contain two integers \(v_i,u_i\) (\(1≤v_i,u_i≤n, v_i≠u_i\) ) — the description of the i-th edge. The graph should contain no multiple edges — for each pair (x,y) you output, you should output no more pairs (x,y) or (y,x).

样例输入 Sample Input###

5
1 4 1 1 1

样例输出 Sample Output###

YES 2
4
1 2
3 2
4 2
5 2

数据范围及提示 Data Size & Hint###

见上面

之前的一些废话###

明天考高代,所以这个比赛根本没人参加,我也是就把这道题首刀了之后就去复习了

题解###

为了使我们的直径最长,我们通过画图发现直径两端的点度数为1,所以我们需要把度数最小的两个点放到直径两端,然后剩下的所有度数大于1的点都可以充当直径上的点,(可以证明这些点不放在直径上都是浪费),然后剩下的那些度数为1的点就用来充当直径上的分岔就好了。

最后一定是一棵树。

代码###

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair<int,int> PII;
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
bool e[510][510];
PII a[510];
int n,first,last,list[510],dm,val[510];
bool ok;
void add(int A,int B){e[A][B]=e[B][A]=1;}//printf("add:%d %d\n",A,B);}
int main()
{
n=read();
for(int i=1;i<=n;i++)a[i].first=read(),a[i].second=i;
sort(a+1,a+n+1);
first=a[1].second;last=a[2].second;
list[++dm]=first;val[dm]=a[1].first;
for(int i=3;i<=n;i++)
if(a[i].first>=2)list[++dm]=a[i].second,val[dm]=a[i].first,add(list[dm],list[dm-1]);
list[++dm]=last;val[dm]=a[2].first;add(list[dm],list[dm-1]);
int pos=3;
for(int i=2;i<=dm-1;i++)
for(int j=1;j<=val[i]-2;j++)
{
if(a[pos].first==1)add(list[i],a[pos].second),pos++;//printf("pos %d\n",pos);
if(a[pos].first>1)break;
}
if(a[pos].first==1){
printf("NO\n");
return 0;
}
int cnt=0;
printf("YES %d\n",dm-1);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)if(e[i][j])cnt++;
printf("%d\n",cnt);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)if(e[i][j])printf("%d %d\n",i,j);
return 0;
}

总结###

虽然构造题做的少(基本没做过),但是这道题我觉得还是比较简单,多多画图,就知道咋做了。

[CF1082D]Maximum Diameter Graph的更多相关文章

  1. cf1082D Maximum Diameter Graph(构造+模拟+细节)

    QWQ不得不说 \(cf\)的\(edu\ round\)出这种东西 有点太恶心了 题目大意:给你\(n\)个点,告诉你每个点的最大度数值(也就是说你的度数要小于等于这个),让你构造一个无向图,使其满 ...

  2. Educational Codeforces Round 55 (Rated for Div. 2):D. Maximum Diameter Graph

    D. Maximum Diameter Graph 题目链接:https://codeforces.com/contest/1082/problem/D 题意: 给出n个点的最大入度数,要求添加边构成 ...

  3. Educational Codeforces Round 55 (Rated for Div. 2) D. Maximum Diameter Graph (构造图)

    D. Maximum Diameter Graph time limit per test2 seconds memory limit per test256 megabytes inputstand ...

  4. CF1082D:Maximum Diameter Graph (简单构造)

    Graph constructive problems are back! This time the graph you are asked to build should match the fo ...

  5. D. Maximum Diameter Graph 贪心+图论+模拟

    题意:给出n个点的度数列 上限(实际点可以小于该度数列)问可以构造简单路最大长度是多少(n个点要连通 不能有平行边.重边) 思路:直接构造一条长链  先把度数为1的点 和度数大于1的点分开  先把度数 ...

  6. Codeforces 1082D Maximum Diameter Graph (贪心构造)

    <题目链接> 题目大意:给你一些点的最大度数,让你构造一张图,使得该图的直径最长,输出对应直径以及所有的边. 解题分析:一道比较暴力的构造题,首先,我们贪心的想,要使图的直径最长,肯定是尽 ...

  7. CodeForces 1082 D Maximum Diameter Graph

    题目传送门 题意:现在有n个点,每个点的度数最大为di,现在要求你构成一棵树,求直径最长. 题解:把所有度数为2的点先扣出来,这些就是这颗树的主干,也就是最长的距离. 然后我们把度数为2的点连起来,之 ...

  8. Codeforces 1082 D. Maximum Diameter Graph-树的直径-最长链-构造题 (Educational Codeforces Round 55 (Rated for Div. 2))

    D. Maximum Diameter Graph time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  9. CF1082解题报告

    CF1082A Vasya and Book 模拟一下即可 \(Code\ Below:\) #include <bits/stdc++.h> using namespace std; c ...

随机推荐

  1. ES-映射和分析

    参考: https://es.xiaoleilu.com/052_Mapping_Analysis/00_Intro.html 1. 概念 映射(mapping)机制用于进行字段类型确认,将每个字段匹 ...

  2. 《C#并发编程经典实例》学习笔记—3.1 数据的并行处理

    问题 有一批数据,需要对每个元素进行相同的操作.该操作是计算密集型的,需要耗费一定的时间. 解决方案 常见的操作可以粗略分为 计算密集型操作 和 IO密集型操作.计算密集型操作主要是依赖于CPU计算, ...

  3. Ali 访问控制 RAM 用户身份

    Ali 访问控制 RAM 用户身份 2018/11/13 Chenxin 参考: https://help.aliyun.com/product/28625.html?spm=a2c4g.111866 ...

  4. Redis配置文件详解(redis.conf)

    # vi redis.conf   daemonize yes #是否以后台进程运行 pidfile /var/run/redis/redis-server.pid    #pid文件位置 port ...

  5. s3c2440裸机-代码重定位(2.编程实现代码重定位)

    代码重定位(2.编程实现代码重定位) 1.引入链接脚本 我们上一节讲述了为什么要重定位代码,那么怎么去重定位代码呢? 上一节我们发现"arm-linux-ld -Ttext 0 -Tdata ...

  6. Cocos2d-x开发教程——《萝莉快跑》

    更好的阅读体验请前往<萝莉快跑>开发教程. 配置:win7+Cocos2d-x.2.0.3+VS2012 目标读者:已经了解图形显示.动作.回调函数.定时器的用法. 一.基本知识点 1.动 ...

  7. 浮点运算与boost.multiprecision

    在C++中,float占4个字节,double占8个字节,均采用 IEEE 754 浮点标准:内部都是以二进制为基础,表述实数,有些实数可以被精确表述,比如0.2,但有些不行,比如0.3.针对这一点, ...

  8. laravel5+ElasticSearch+go-mysql-elasticsearch MySQL数据实时导入(mac)

    1. ElasticSearch安装 直接使用brew install elasticsearch 安装最新版本的es,基本没有障碍. 2.Laravel5 框架添加elasticsearch支持 在 ...

  9. php isset()和 in_array()

    结果: 结论: isset()完胜

  10. E-factory

    E-factory为生成XML和HTML提供了一种简单而紧凑的语法 # coding:utf-8 from lxml.builder import E def CLASS(*args): # clas ...