[CF1082D]Maximum Diameter Graph
题目描述 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的更多相关文章
- cf1082D Maximum Diameter Graph(构造+模拟+细节)
QWQ不得不说 \(cf\)的\(edu\ round\)出这种东西 有点太恶心了 题目大意:给你\(n\)个点,告诉你每个点的最大度数值(也就是说你的度数要小于等于这个),让你构造一个无向图,使其满 ...
- Educational Codeforces Round 55 (Rated for Div. 2):D. Maximum Diameter Graph
D. Maximum Diameter Graph 题目链接:https://codeforces.com/contest/1082/problem/D 题意: 给出n个点的最大入度数,要求添加边构成 ...
- 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 ...
- CF1082D:Maximum Diameter Graph (简单构造)
Graph constructive problems are back! This time the graph you are asked to build should match the fo ...
- D. Maximum Diameter Graph 贪心+图论+模拟
题意:给出n个点的度数列 上限(实际点可以小于该度数列)问可以构造简单路最大长度是多少(n个点要连通 不能有平行边.重边) 思路:直接构造一条长链 先把度数为1的点 和度数大于1的点分开 先把度数 ...
- Codeforces 1082D Maximum Diameter Graph (贪心构造)
<题目链接> 题目大意:给你一些点的最大度数,让你构造一张图,使得该图的直径最长,输出对应直径以及所有的边. 解题分析:一道比较暴力的构造题,首先,我们贪心的想,要使图的直径最长,肯定是尽 ...
- CodeForces 1082 D Maximum Diameter Graph
题目传送门 题意:现在有n个点,每个点的度数最大为di,现在要求你构成一棵树,求直径最长. 题解:把所有度数为2的点先扣出来,这些就是这颗树的主干,也就是最长的距离. 然后我们把度数为2的点连起来,之 ...
- 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 ...
- CF1082解题报告
CF1082A Vasya and Book 模拟一下即可 \(Code\ Below:\) #include <bits/stdc++.h> using namespace std; c ...
随机推荐
- Access the Security System in Code 在代码中访问安全系统
This lesson will guide you through using the static SecuritySystem class to check whether or not a u ...
- MyBatis框架之第一篇
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis.201 ...
- Python如何运行程序
人生苦短,我用Python. 作为一个开发人员,如何写代码是必须要知道的,代码如何运行也是有必要了解的.通过了解代码如何运行,可指导我们写出效率更高的代码.下午看了<Python学习手册> ...
- 如何快速找到多个字典中的公共键(key)
from random import randint, sample #sample随机取样 d1 = {k: randint(1, 4) for k in sample('abcdefgh', ra ...
- [Go] 实现面向对象中的继承和覆盖方法
go中的继承是使用结构体嵌套实现的,可以继承父类的方法 覆盖和其他面向对象的语言是一样的,函数名,参数,返回类型一致,就可以覆盖父类的方法 package main import "log& ...
- 5 其他命令-学习目标以及find命令的基本使用
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- OOAD 面向对象的分析与设计
OOAD 面向对象的分析与设计 OOA-----分析阶段(针对业务问题清晰视图, 列出系统完成任务, 整理业务的公共词汇, 列出解决业务的解决方法) O ...
- tf.InteractiveSession()与tf.Session()的区别
Tensorflow依赖于一个高效的C++后端来进行计算.与后端的这个连接叫做session.一般而言,使用TensorFlow程序的流程是先创建一个图,然后在session中启动它. 这里,我们使用 ...
- js获取数组最大值或最小值
数组对象arr中属性num最大值最小值 // 最大值 Math.max.apply(Math,arr.map(item => { return item.num })) arr.sort((a, ...
- typescript与nodejs(二)基于装饰器实现路由表
之前实现了一个简单的WebServer 但是这离实际使用还有一点距离 webserver 首先面对第一个问题是路由表 啥是路由表 路由表别看听起来神秘,但是其实就是 if else onhttp- { ...