Codeforces 1082D Maximum Diameter Graph (贪心构造)
<题目链接>
题目大意:
给你一些点的最大度数,让你构造一张图,使得该图的直径最长,输出对应直径以及所有的边。
解题分析:
一道比较暴力的构造题,首先,我们贪心的想,要使图的直径最长,肯定是尽可能的将所有的顶点连在同一条链上,并且,所有度数为1的点都只能作为最外围的点。所以,基本思想就是先将两个度为1的顶点放在链的两端(如果有的话),然后所有度>=2的点放在链的中间,建好链之后,再将多余的度为1的点挂在链上最大度数未满的点上。
#include <bits/stdc++.h>
using namespace std; const int N = ;
int n,ind[N];
struct Node{
int ind,loc;
bool operator < (const Node &tmp){
return ind>tmp.ind;
}
};
vector<Node>vec1,vec; int main(){
scanf("%d",&n); for(int i=;i<=n;i++){
int numd;scanf("%d",&numd);
if(numd==)vec1.push_back(Node{numd,i});
if(numd>)vec.push_back(Node{numd,i});
}
if(vec1.size()<=){
if(vec1.size()==){
printf("YES %d\n",vec.size()-);
printf("%d\n",vec.size()-);
int u=vec[].loc;
for(int i=;i<vec.size();i++){
int v=vec[i].loc;printf("%d %d\n",u,v);
u=v;
}
}else {
if(vec1.size()==){
printf("YES %d\n",vec.size());
printf("%d\n",vec.size());
int u=vec1[].loc;
for(int i=;i<vec.size();i++){
int v=vec[i].loc;printf("%d %d\n",u,v);
u=v;
}
}else if(vec1.size()==){
printf("YES %d\n",vec.size()+);
printf("%d\n",vec.size()+);
int u=vec1[].loc;
for(int i=;i<vec.size();i++){
int v=vec[i].loc;printf("%d %d\n",u,v);
u=v;
}
printf("%d %d\n",vec[vec.size()-].loc,vec1[].loc);
}
}
}else { //如果度为1的点多于2个
int sum=;
for(int i=;i<vec.size();i++){
vec[i].ind-=;
sum+=vec[i].ind;
}
if(sum<vec1.size()-)return puts("NO"),;
printf("YES %d\n",vec.size()+);
printf("%d\n",vec.size()++vec1.size()-);
int u=vec1[].loc;
for(int i=;i<vec.size();i++){
int v=vec[i].loc;printf("%d %d\n",u,v);
u=v;
}
printf("%d %d\n",vec[vec.size()-].loc,vec1[].loc);
sort(vec.begin(),vec.end());
int pos=;
for(int i=;i<vec1.size();i++){
vec[pos].ind--;
printf("%d %d\n",vec1[i].loc,vec[pos].loc);
if(vec[pos].ind==)pos++;
}
}
}
Codeforces 1082D Maximum Diameter Graph (贪心构造)的更多相关文章
- D. Maximum Diameter Graph 贪心+图论+模拟
题意:给出n个点的度数列 上限(实际点可以小于该度数列)问可以构造简单路最大长度是多少(n个点要连通 不能有平行边.重边) 思路:直接构造一条长链 先把度数为1的点 和度数大于1的点分开 先把度数 ...
- 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 ...
- CodeForces 1082 D Maximum Diameter Graph
题目传送门 题意:现在有n个点,每个点的度数最大为di,现在要求你构成一棵树,求直径最长. 题解:把所有度数为2的点先扣出来,这些就是这颗树的主干,也就是最长的距离. 然后我们把度数为2的点连起来,之 ...
- [CF1082D]Maximum Diameter Graph
题目描述 Description Graph constructive problems are back! This time the graph you are asked to build sh ...
- CodeForces - 459E Pashmak and Graph[贪心优化dp]
E. Pashmak and Graph time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Educational Codeforces Round 20 C 数学/贪心/构造
C. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard input ...
随机推荐
- SVG前戏—让你的View多姿多彩
什么是SVG SVG的全称是Scalable Vector Graphics,叫可缩放矢量图形.是一种基于可扩展标记语言(XML).它和位图(Bitmap)相对,SVG不会像位图一样因为缩放而让图片质 ...
- python 面向对象编程(高级篇)
飞机票 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对 ...
- nginx安装目录详解(针对centos)
- 3790:最短路径问题(HDU)
Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Inp ...
- ubuntu MySQL的安装
https://i.cnblogs.com/EditPosts.aspx?opt=1 https://juejin.im/entry/5adb5deff265da0b9d77cb3b MySQL Co ...
- MongoDB----提升
文档之间的联系 一对一:通过文档内嵌的形式体现一对一的关系 db.user.insert({name:"xiaoming",frind:{name:"xiahua&quo ...
- cf里的一些简单组合数题
cf711D 成环的和不成环的要单独计算,环用双联通做的QAQ /* 所有情况-成环的情况 */ #include<bits/stdc++.h> using namespace std; ...
- cf1144G 将串分解成单调递增和递减子串(贪心)
这算哪门子dp.. 具体做法就是贪心,建立两个vector存递增序列递减序列,操作过程中a可以合法地匀一个给b 就是判断第i个数放在递增序列里还是放在递减序列里,需要根据后面的数来进行决策 #incl ...
- poj3107树的重心
/*树的重心求法:两次dfs,第一次dfs处理出每个结点的size,以此求每个结点大儿子的size,第二次dfs将每个结点大儿子的size和余下结点数进行比较,所有结点里两个值之间差值最小的那个点就是 ...
- spring集成jwt验证方式,token验证
为什么要告别session?有这样一个场景,系统的数据量达到千万级,需要几台服务器部署,当一个用户在其中一台服务器登录后,用session保存其登录信息,其他服务器怎么知道该用户登录了?(单点登录), ...