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. android 界面切换教程

    Android的界面切换其实并没有什么难度,就和java的界面切换一样简单,但是java的使用的是Swing框架进行的切换,而Android使用的是Intent 来切换框架的,这是一个全新的使用方法, ...

  2. java元注解(注解在注解上的注解)

    //ElementType.TYPE 给类.接口.枚举上使用 @Target(ElementType.TYPE)//给注解进行注解,表示该注解可以用在什么地方 //@Retention(Retenti ...

  3. Hibernate-ORM:13.Hibernate中的连接查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客将会解释Hibernate中的连接查询(各种join) 一,目录 1.内链接 1.1显式内连接(inn ...

  4. find的详细使用

    对我我这个出学者,这个已经算是很难了,不过今天整理了一下,感觉还可以接受. find Linux中十分重要的一个查找功能, [root@moban /]# find /tmp/ -type f -na ...

  5. MySQL数据库服务器逐渐变慢分析与解决

    一.检查系统的状态 通过操作系统的一些工具检查系统的状态,比如CPU.内存.交换.磁盘的利用率,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲,这也可能不是一个正常的状态,因为cpu可 ...

  6. CSS实现简易的轮播图

    <html> <head> <meta charset="UTF-8"> <title></title> <sty ...

  7. Qt_C++交换两个数

    在编程过程中,交换两个数是我用常用的 ,这里做下简单的搬运 bool Widget::swap(int a, int b) { int temp =a; a= b; b = temp; } 这种方式其 ...

  8. linux学习总结---web前端③

    css3: border-radius opacity: transform: 旋转 rotate 平移translate 缩放scale 扭曲skew transition:转变 强调:开始和结束 ...

  9. ZooKeeper的伪分布式集群搭建

    ZooKeeper集群的一些基本概念 zookeeper集群搭建: zk集群,主从节点,心跳机制(选举模式) 配置数据文件 myid 1/2/3 对应 server.1/2/3 通过 zkCli.sh ...

  10. gitbook生成的_book文件本地打开后链接失效问题

    Gitbook 生成本地 html 的问题 在本地用 gitbook-cli根据 Summary 生成目录 然后在每个 md 文件里书写内容 然后用 gitbook serve .生成本地 html ...