[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 ...
随机推荐
- SpringBoot集成swagger2.0
最近项目里要用到SpringBoot + swagger,查了其他小伙伴们的资料,或多或少有点问题,在此我再梳理一遍. 1.maven依赖 <parent> <groupId> ...
- 易优CMS:switch的基础用法
[基础用法] 名称:switch 功能:简单条件判断,比if判断标签少些不等于相同功能,视个人习惯而用. 语法: {eyou:switch name='$eyou.field.has_children ...
- FCC---CSS Flexbox: Add Flex Superpowers to the Tweet Embed
To the right is the tweet embed that will be used as the practical example. Some of the elements wou ...
- C lang: The Command line
Ax_command line h Ax_a command line describe The command line is in enviroment for DOS,to user opera ...
- Cesium专栏-淹没分析(附源码下载)
Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...
- leaflet 结合 Echarts4 实现散点图(附源码下载)
前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...
- 使用webstrom开发小程序要做的设置
1.关闭rpx的错误提示 在setting里面 -->搜索inspections --> 在右侧找到invalid CSS property value 把对勾划掉
- 关于在maven项目中配置文件资源导出问题
标准的Maven项目都会有一个resources目录来存放我们所有的资源配置文件,但是我们往往在项目中不仅仅会把所有的资源配置文件都放在resources中,同时我们也有可能放在项目中的其他位置,那么 ...
- quarter软件的破解
链接;http://www.openedv.com/forum.php?mod=viewthread&tid=275857&extra=page%3D1 这个是正点原子提供的破解方法, ...
- Linux下动态切换EHCI控制器下端口的速率(即切换为12M)
在sys目录下找到对应的控制器 例如:/sys/devices/platform/soc/ehci,直接操作该目录下的companion echo 1 > companion 将port1设 ...