2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015) Adjoin the Networks (树的直径)
、
题目大意:有n个点m条边,现在希望将所有的点连接在一起,且要求生成的树的直径尽可能小,问树的直径最小的最大值多少
解题思路:对于目前每个独立的树,求出其的直径,对直径进行排序,为了让最后的树的直径尽可能的小,能做的就是每次将每个树的直径的一半都连接起来,于是最后的答案就从三种情况下出现,第一个情况就是最长的那个树的直径就是最后答案,第二个情况就是最长的直径的一半加次长的直径的一半+1,第三个情况就是次长一半加上次次长的一半+2就是答案
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long LL;vector<int> tu[100005];
int n,m;
int check[100005],dis[100005],vis[100005];
int ans[100005], t;
int bfs1(int x)
{int i,k,u,flag;int MAX = 0;flag=x;vis[x]=1;queue<int> qua;qua.push(x);dis[x]=0;while(!qua.empty()){k=qua.front();qua.pop();for(i=0;i<tu[k].size();i++){u=tu[k][i];if(vis[u])continue;vis[u] = 1;qua.push(u);dis[u]=dis[k]+1;if(MAX<dis[u]){flag=u;MAX=dis[u];}}}return flag;
}
int bfs2(int x)
{int i,k,u,flag;int MAX = 0;flag=x;check[x]=1;queue<int> qua;qua.push(x);dis[x]=0;while(!qua.empty()){k=qua.front();qua.pop();for(i=0;i<tu[k].size();i++){u=tu[k][i];if(check[u])continue;check[u] = 1;qua.push(u);dis[u]=dis[k]+1;if(MAX<dis[u]){flag=u;MAX=dis[u];}}}return flag;
}
bool cmp(int x,int y)
{return x>y;
}
int main()
{int i,x,y;cin>>n>>m;for(i=1;i<=m;i++){cin>>x>>y;tu[x].push_back(y);tu[y].push_back(x);} memset(vis,0,sizeof(vis));for(i=0;i<n;i++){if(vis[i]==0){int u=bfs1(i);int v=bfs2(u);ans[++t] = dis[v];}}sort(ans + 1, ans + t + 1,cmp);cout<<max(ans[1],max((ans[1]+1)/2+(ans[2]+1)/2+1,(ans[2]+1)/2+(ans[3]+1)/2+2))<<endl;
}
2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015) Adjoin the Networks (树的直径)相关推荐
- 2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016)题解
2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016) A - Artwork 题目描述: 给定N*M的网格,给出Q次 ...
- 2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)
D.Distinctive Character 看到样例,第一个反应贪心.先写了个按这一位1和0的数目多少,确定0还是1的东西.感觉不够真,又写了个尽量加到相似的比较小的串上的贪心.在和前边的那个组合 ...
- Nordic Collegiate Programming Contest (NCPC) 2016
A Artwork B Bless You Autocorrect! C Card Hand Sorting D Daydreaming Stockbroker 贪心,低买高卖,不要爆int. #in ...
- 2018 ACM ICPC Arabella Collegiate Programming Contest A
Multiplication operation is not always easy! For example, it is hard to calculate 27 × 20 using your ...
- A - Multiplication Dilemma (思维)( 2018 ACM ICPC Arabella Collegiate Programming Contest)
滴答滴答---题目链接 Multiplication operation is not always easy! For example, it is hard to calculate 27 × 2 ...
- 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) - 4.28
赛后补了几道 赛中我就写了两个... A - Altruistic AmphibiansGym - 101933A 看了眼榜没几个人做.就没看. 最后发现就是一个DP(但是我觉得复杂度有点迷) 题意: ...
- Nordic Collegiate Programming Contest 2017 题解
前几天打了一场外国人的比赛,感觉那边的题目质量还是很好的,区分度很鲜明,题目没有国内的难,坑点比较少,比较注重思维,基础算法. B题: Best Relay Team Picture by Ferna ...
- 2016 ACM / ICPC Asia dalian Regional Contest 题解(11 / 11)【每日亿题2021 / 2 / 17】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A .(2017 ACM ICPC dalian H)To begin or not to be ...
- Nordic Collegiate Programming Contest 2016
A Artwork 输入: n,m表示原图为n*m个白色方格,输入x1,y1,x2,y2表示将x1,y1,x2,y2涂为黑色. 输出: 对于每个x1,y1,x2,y2输入当前图案白色联通块的数目. 思 ...
- 2019-2020 ACM ICPC Brazil Subregional Programming Contest E.Exhibition of Clownfish
我搬运我自己应该算原创吧 题目 题意 题解 题意 某水族馆有一种神奇的
最新文章
- 晶体管逻辑芯片设计微缩图形化
- [转]C++基础:C++的结构struct
- 操作系统原理第五章:CPU调度
- All in one TFS 项目建立
- 本地方法中printf如何传给java--java系统级命名管道
- Oracle学习:条件表达式及分组函数
- 《动物森友会》的社交分级,在虚拟世界设计舒适的社交氛围
- SQL Server将数据库中的表复制到另一个数据库
- linux软件中心替代,Ubuntu 16.04 LTS 将替换 Ubuntu 软件中心
- python外汇兑换代码_python爬取人民币汇率中间价
- 一文看懂数据挖掘:哪一种方法最好?都需要哪些技术?
- JAVA菜鸟入门HelloWorld
- 北京大学数学科学学院2006/9/20声明:坚持真理、追求卓越zz
- 计算机房通气换气次数,各种换气次数汇总
- 【渝粤题库】陕西师范大学164109人力资源管理 作业(高起专)
- 华为荣耀9手机通过在Fastboot模式写ramdisk.img来获取ROOT权限 | 华为荣耀9怎么获取ROOT权限 | 华为荣耀9怎么用面具Magisk做ROOT权限
- Composer下载以及安装
- 8.17 一个博客demo
- java正则表达式匹配任意中文_java匹配中文的正则表达式
- 通过AI实现实时数据分析和态势监测,进而让机器能够处理日常决策