Educational Codeforces Round 55 (Rated for Div. 2):D. Maximum Diameter Graph
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的更多相关文章
- Educational Codeforces Round 55 (Rated for Div. 2):E. Increasing Frequency
E. Increasing Frequency 题目链接:https://codeforces.com/contest/1082/problem/E 题意: 给出n个数以及一个c,现在可以对一个区间上 ...
- Educational Codeforces Round 55 (Rated for Div. 2):C. Multi-Subject Competition
C. Multi-Subject Competition 题目链接:https://codeforces.com/contest/1082/problem/C 题意: 给出n个信息,每个信息包含专业编 ...
- Educational Codeforces Round 47 (Rated for Div. 2) :D. Relatively Prime Graph
题目链接:http://codeforces.com/contest/1009/problem/D 解题心得: 题意就是给你n个点编号1-n,要你建立m条无向边在两个互质的点之间,最后所有点形成一个连 ...
- Educational Codeforces Round 55 (Rated for Div. 2)E
题:https://codeforces.com/contest/1082/problem/E 题意:给出n个数和一个数c,只能操作一次将[L,R]之间的数+任意数,问最后该序列中能存在最多多少个c ...
- 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 ...
- 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-& ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- ADB工具的安装
1.Windows ADB工具下载地址: https://developer.android.google.cn/studio/releases/platform-tools ADB工具官网教程: h ...
- 一起来学习Shell脚本
Shell脚本 Shell脚本(shell script),是一种为shell编写的脚本程序. 大家所说的shell通常都是指的shell脚本,但其实shell与shell脚本是两个不同的概念.由于习 ...
- 用ServiceStack操作使用redis的问题
最近在学习Redis,查阅网上很多资料后使用SericeStack连接redis.在nuget中下载ServiceStack.Redis,主要使用到四个dll 但是运行之后会出现一堆奇怪问题:没有实现 ...
- vs13发布web程序 iis上
一.配置iis 1,找到控制面板--程序--启用或关闭Windows功能 2,从列表中选择Internet Infomation Services,并且把相应的功能条目勾选上,如果不清楚,可以全部选中 ...
- 「暑期训练」「Brute Force」 Restoring Painting (CFR353D2B)
题意 给定一定条件,问符合的矩阵有几种. 分析 见了鬼了,这破题谁加的brute force的标签,素质极差.因为范围是1e5,那你平方(枚举算法)的复杂度必然爆. 然后你就会思考其中奥妙无穷的数学规 ...
- 【题解搬运】PAT_L1-009 N个数求和
从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...
- Charles的Https抓包及弱网配置
一.Charles的主要功能 (1)截取Http 和 Https 网络封包. (2)支持重发网络请求,修改请求参数,方便后端调试. (3)支持模拟弱网环境. 二.配置简单抓包 1.设置系统代理:勾选P ...
- python接口测试(一)——http请求及token获取
使用python对当前的接口进行简单的测试 1.接口测试是针对软件对外提供服务得接口得输入输出进行得测试,验证接口功能与接口描述文档得一致性 返回结果可以为字符串,json,xml等 2.接口的请求方 ...
- 06-Mysql数据库----表的操作
06-表的操作 本节掌握 存储引擎介绍(了解) 表的增删改查 一.存储引擎(了解) 前几节我们知道mysql中建立的库===>文件夹,库中的表====>文件 现实生活中我们用来存储数据 ...
- C# 删除文件错误 access denied
使用以下代码正常删除整个文件夹内容时,报错如下: if (backupPathDir.Exists) { System.IO.DirectoryInfo di = new DirectoryInfo( ...