D. Maximum Diameter Graph

题目链接https://codeforces.com/contest/1082/problem/D

题意:

给出n个点的最大入度数,要求添加边构成一个无环无向无重边的图,并且最大化图中的最短路径。

题解:

要求最短路径最大,我们会想到把每一个允许入度可以大于1的点先连起来,形成一个”链“,当前肯定满足条件,并且两端点的最短路径长度是所有情况中最大的。

然后对于入度为1的点,先尽量考虑放在链的两端,然后再在中间随便插入。

代码如下:

先附上自己用邻接矩阵存储的丑代码。。。代码思路比较直接:

#include <bits/stdc++.h>
using namespace std; const int N = ;
int Map[N][N],vis[N],a[N];
int n; int main(){
scanf("%d",&n);
int cnt = ,tot = ,st = ;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]==) cnt++;
else st=i;
}
vis[st]=;bool flag=false;
int end=st;
for(int i=st;;i=end){
if(flag) break;
int tmp=;
for(int j=;j<=n;j++){
if(a[j]> && !vis[j]){
tmp++;
Map[i][j]=Map[j][i]=;
vis[j]=;
a[i]--;a[j]--;
end=j;
break;
}
}
if(!tmp) flag=true;
}
int tmp = ;
for(int i=;i<=n;i++) if(vis[i]) tot+=a[i],tmp++;
if(cnt>tot){
cout<<"NO";
return ;
}
int ans,edges=tmp-;
if(cnt>) ans=edges+;
else if(cnt==) ans=edges+;
else ans=edges;
cout<<"YES"<<" "<<ans<<endl;
if(cnt){
cnt--;
for(int i=;i<=n;i++) if(!vis[i]){
vis[i]=Map[i][st]=Map[st][i]=;
edges++;
a[st]--;a[i]--;
break ;
}
if(cnt){
cnt--;
for(int i=;i<=n;i++) if(!vis[i]){
vis[i]=Map[i][end]=Map[end][i]=;
edges++;
a[end]--;a[i]--;
break;
}
}
if(cnt){
for(int i=n;i>=;i--) if(!vis[i]){
vis[i]=;
for(int j=;j<=n;j++){
if(a[j] && vis[j] &&j!=i){
edges++;
Map[j][i]=Map[i][j]=;
a[j]--;a[i]--;
break;
}
}
}
}
}
cout<<edges<<endl;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(Map[i][j]) printf("%d %d\n",i,j);
return ;
}

再来一个O(N)的算法,注意一下代码的细节,直接像链一样连边:

#include <bits/stdc++.h>
using namespace std; const int N = ;
int a[N];
int n,sum; int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]),sum+=a[i];
if(sum<*(n-)){
cout<<"NO";return ;
}
vector <int> ones;
for(int i=;i<=n;i++){
if(a[i]==) a[i]= , ones.push_back(i);
}
int t=ones.size();
printf("YES %d\n%d\n",n-t-+min(t,),n-);
int st=;
if(!ones.empty()){
st=ones.back();
ones.pop_back();
}
for(int i=;i<=n;i++){//从起点开始添边形成一个链
if(a[i]>){
if(st){
a[st]--;a[i]--;
printf("%d %d\n",st,i);
}
st=i;
}
}
for(int i=n;i>=;i--){ // 从尾开始添加(在链上)
while(a[i]> && !ones.empty()){
a[i]--;
int now1 = ones.back();ones.pop_back();
printf("%d %d\n",i,now1);
}
}
return ;
}

Educational Codeforces Round 55 (Rated for Div. 2):D. Maximum Diameter Graph的更多相关文章

  1. Educational Codeforces Round 55 (Rated for Div. 2):E. Increasing Frequency

    E. Increasing Frequency 题目链接:https://codeforces.com/contest/1082/problem/E 题意: 给出n个数以及一个c,现在可以对一个区间上 ...

  2. Educational Codeforces Round 55 (Rated for Div. 2):C. Multi-Subject Competition

    C. Multi-Subject Competition 题目链接:https://codeforces.com/contest/1082/problem/C 题意: 给出n个信息,每个信息包含专业编 ...

  3. Educational Codeforces Round 47 (Rated for Div. 2) :D. Relatively Prime Graph

    题目链接:http://codeforces.com/contest/1009/problem/D 解题心得: 题意就是给你n个点编号1-n,要你建立m条无向边在两个互质的点之间,最后所有点形成一个连 ...

  4. Educational Codeforces Round 55 (Rated for Div. 2)E

    题:https://codeforces.com/contest/1082/problem/E 题意:给出n个数和一个数c,只能操作一次将[L,R]之间的数+任意数,问最后该序列中能存在最多多少个c ...

  5. Educational Codeforces Round 55 (Rated for Div. 2) C. Multi-Subject Competition 【vector 预处理优化】

    传送门:http://codeforces.com/contest/1082/problem/C C. Multi-Subject Competition time limit per test 2 ...

  6. Educational Codeforces Round 55 (Rated for Div. 2) A/B/C/D

    http://codeforces.com/contest/1082/problem/A WA数发,因为默认为x<y = = 分情况讨论,直达 or x->1->y  or  x-& ...

  7. Educational Codeforces Round 55 (Rated for Div. 2) B. Vova and Trophies 【贪心 】

    传送门:http://codeforces.com/contest/1082/problem/B B. Vova and Trophies time limit per test 2 seconds ...

  8. Codeforces 1082 C. Multi-Subject Competition-有点意思 (Educational Codeforces Round 55 (Rated for Div. 2))

    C. Multi-Subject Competition time limit per test 2 seconds memory limit per test 256 megabytes input ...

  9. Codeforces 1082 A. Vasya and Book-题意 (Educational Codeforces Round 55 (Rated for Div. 2))

    A. Vasya and Book time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

随机推荐

  1. 爬虫之requests模块基础

    一.request模块介绍 1. 什么是request模块 - python中原生的基于网络请求的模块,模拟浏览器发起请求. 2. 为什么使用request模块 - urllib需要手动处理url编码 ...

  2. 回形矩阵--python

    def bsm(n): a = [[0]*n for x in range(n)] p = 0 q = n-1 t = 1 while p < q: for i in range(p,q): a ...

  3. Mongoose模式的扩展

    模式的扩展 默认值 默认值的类型: 固定值.即使生成 代码展示: var mongoose = require('mongoose');mongoose.connect('mongodb://loca ...

  4. (数据科学学习手札12)K-means聚类实战(基于R)

    上一篇我们详细介绍了普通的K-means聚类法在Python和R中各自的实现方法,本篇便以实际工作中遇到的数据集为例进行实战说明. 数据说明: 本次实战样本数据集来自浪潮集团提供的美团的商家信息,因涉 ...

  5. 用intellij Idea加载eclipse的maven项目全流程

    eclipse的maven项目目录 全流程 加载项目 打开intellij Idea file -> new -> module from existing Sources  选择.pom ...

  6. Java常考面试题

    Java常考面试题 1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 答:Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行 ...

  7. Java集合类面试题

    java.util包中包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式. 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最 ...

  8. 从C到C++ (2)

    从C到C++ (2) 一.    C++中增加了作用域标示符 :: 1.     用于对局部变量同名的全局变量进行访问. 2.     用于表示类成员. 二.    new.delete运算符 1.  ...

  9. Android 序列化比对

    本文转自:https://www.zybuluo.com/linux1s1s/note/91046 注:部分内容有更改 在Android中使用序列化,无非两种途经: Parcelable 和 Seri ...

  10. Anytime项目开发记录2

    注册,登陆于密码找回.这是这次记录的主要内容. 首先,我们来看类图: 因为一直在改,所以与第二篇介绍项目框架时的图会有一些不一样. 代码都是非常简单的. 由于在注册和登陆这里,需要弹出一些对话框告诉用 ...