题面

传送门

分析

贪心

将度限制大于1的点连成一条链,然后将度限制等于1的点挂上去

形状如下图,其中(1,2,3)为度数限制>1的点

显然直径长度=(度数限制>1的节点个数)-1+min(度数限制等于1的节点个数,2)

那么具体如何构造?

首先将度为1和度>1的节点分开

如果有至少1个度为1的节点,就把它作为直径的起点,如图中的4

然后再将度>1的节点全部接上去

再从另一头倒着挂(图中3开始向2,1)剩下的度为1的节点

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define maxn 10005
using namespace std;
int n;
int a[maxn];
struct edge{
int from;
int to;
edge(){ }
edge(int u,int v){
from=u;
to=v;
}
void print(){
printf("%d %d\n",from,to);
}
};
vector<edge>ans;
vector<int>l;
int main(){
int leaf=0;
scanf("%d",&n);
int sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
if(a[i]==1) leaf++;
if(a[i]==0){
printf("NO\n");
return 0;
}
}
if(sum<n*2-2){
printf("NO\n");
return 0;
} for(int i=1;i<=n;i++){
if(a[i]==1){
l.push_back(i);
a[i]=0;
}
} int begin=-1;
if(l.size()){
begin=l[l.size()-1];
l.pop_back();
}
for(int i=1;i<=n;i++){
if(a[i]>1){
if(begin!=-1){
a[begin]--;
a[i]--;
ans.push_back(edge(begin,i));
}
begin=i;
}
}
int t=0;
for(int i=n;i>=1;i--){
while(l.size()&&a[i]>0){
a[i]--;
ans.push_back(edge(i,l[t++]));
if(t>=l.size()) break;
}
if(t>=l.size()) break;
} int d=(n-leaf)-1+min(2,leaf);
if(ans.size()==n-1){
printf("YES %d\n%d\n",d,n-1);
for(int i=0;i<n-1;i++){
ans[i].print();
}
}else{
printf("NO\n");
}
}

最新文章

  1. Varnish常用相关命令工具
  2. IrfanView 4.36 中文版发布了
  3. 国外程序员整理的 C++ 资源大全(转)
  4. Python:迭代器
  5. SDL2.0的几何图行绘画
  6. Entity Framework 6新特性:全局性地自定义Code First约定
  7. 如何在Quartus II中设置Virtual pin
  8. POJ 2785
  9. JavaEE是什么?
  10. 知识备忘phpcms 简单解析一 数据表字段
  11. JavaScript-学习一字符串
  12. POJ 2761 Feed the dogs
  13. django新手第一课
  14. day12(表达式,推导式,名称空间与作用域,函数的嵌套定义)
  15. LOJ#6374 网格
  16. [Swift]LeetCode661. 图片平滑器 | Image Smoother
  17. AppBoxFuture(二): Say goodbye to sql!
  18. t-SNE完整笔记
  19. python基础数据类型--list列表
  20. 剑指Offer-从上往下打印二叉树

热门文章

  1. vsftp 主动模式安装
  2. Wireshark中的结果分析
  3. nginx http正向代理简单配置及systemd 配置
  4. Photoshop画笔工具的使用
  5. pycharm安装第三方库失败module &#39;pip&#39; has no attribute &#39;main&#39;
  6. php substr_replace()函数 语法
  7. 一道装呀(状压)DP
  8. 打印XX提交的svn版本信息
  9. 20180711-Java分支结构 – if…else/switch
  10. Oracle中动态SQL详解(EXECUTE IMMEDIATE)