NCPC 2015 - Problem A - Adjoin the Networks
题目链接 : http://codeforces.com/gym/100781/attachments
题意 :
有n个编号为0-n-1的点, 给出目前已经有的边(最多n-1条), 问如何添加最少的边, 使得整个图连通, 且其中两点间距离的最大值最小, 一条边距离为1单位
思路 :
两点间距离的情况 : 1. 子图中任意两点间距离 2.两个子图中两点间的距离
无论如何添加边对第一种的距离都没有影响, 对第二种却有影响
考虑添加一条边连通两个子图后, 最长的距离为 子图1中距离添加边的节点的最长的距离 + 子图2中距离添加边的节点的最长的距离 + 添加的1条边的距离
所以选择添加边的节点是 在某个子图中, 使所有节点到它的最长距离最小的点
但是不用算出这个点, 只需要这个距离, 这个距离就是一个子图中距离最长两点距离的一半, 即(max_length + 1) / 2
一个图中最长距离求法是在对某个子图任一节点深搜, 搜到距离最长的点, 再对这个点深搜, 记录最长距离(新技能)
最终取 : 情况1 和 情况2 距离最大值
注意情况二中, 如果存在三个子图最大(max_length + 1) / 2 都相等, 最终答案是要加2条边的距离而不是加1条, 比如0-1 1-2 3-4 这三个子图
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector> using namespace std; const int MAXN = 1e5+; vector<int> edge[MAXN];
int depth[MAXN];
bool vis[MAXN];
int maxx, maxx1, mark1;
int length[MAXN]; int Max(int a, int b)
{
return a > b ? a : b;
} void Dfs(int u, int fa)
{
vis[u] = ;
depth[u] = depth[fa] + ;
if(depth[u] > maxx1) {
mark1 = u;
maxx1 = depth[u];
}
int len = edge[u].size();
for(int i = ; i < len; i++) {
int v = edge[u][i];
if(v == fa) continue;
Dfs(v, u);
}
} bool cmp(int a, int b)
{
return a > b;
} void Init(int n)
{
for(int i = ; i <= n; i++) {
edge[i].clear();
vis[i] = ;
}
maxx = ;
} int main()
{
int n, l;
int u, v; while(scanf("%d %d", &n, &l) != EOF) {
Init(n);
for(int i = ; i < l; i++) {
scanf("%d %d", &u, &v);
edge[u].push_back(v);
edge[v].push_back(u);
}
int cnt = ;
for(int i = ; i < n; i++) {
maxx1 = ;
if(vis[i] == ) {
depth[i] = -;
Dfs(i, i);
depth[mark1] = -;
if(maxx1 != ) {
Dfs(mark1, mark1);
}
length[i] = (maxx1 + ) / ;
if(maxx1 > maxx) maxx = maxx1;
cnt++;
}
}
sort(length, length+n, cmp);
if(n == ) printf("0\n");
else if(n == ) printf("1\n");
else if(n == ) printf("2\n");
else if(cnt == ) printf("%d\n", maxx);
else if(length[] == length[] && length[] == length[]) {
printf("%d\n", Max(maxx, length[] + length[] + ));
}
else {
printf("%d\n", Max(maxx, length[] + length[] + ));
}
} return ;
}
NCPC 2015 - Problem A - Adjoin the Networks的更多相关文章
- NCPC 2015 October 10, 2015 Problem D
		
NCPC 2015Problem DDisastrous DowntimeProblem ID: downtimeClaus Rebler, cc-by-saYou’re investigating ...
 - Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem K. UTF-8 Decoder 模拟题
		
Problem K. UTF-8 Decoder 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c702 ...
 - Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem I. Alien Rectangles 数学
		
Problem I. Alien Rectangles 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c ...
 - dp - Google Code jam Qualification Round 2015 --- Problem B. Infinite House of Pancakes
		
Problem B. Infinite House of Pancakes Problem's Link: https://code.google.com/codejam/contest/6224 ...
 - Google Code jam Qualification Round 2015  --- Problem A. Standing Ovation
		
Problem A. Standing Ovation Problem's Link: https://code.google.com/codejam/contest/6224486/dashbo ...
 - Google Code Jam Round 1C 2015 Problem A. Brattleship
		
Problem You're about to play a simplified "battleship" game with your little brother. The ...
 - Google Code Jam Round 1A 2015 Problem B. Haircut  二分
		
Problem You are waiting in a long line to get a haircut at a trendy barber shop. The shop has B barb ...
 - Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem H. Parallel Worlds 计算几何
		
Problem H. Parallel Worlds 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c7 ...
 - Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem F. Turning Grille 暴力
		
Problem F. Turning Grille 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c70 ...
 
随机推荐
- 各个函数消耗的时间profiling和内存泄漏valgrind
			
来源:http://06110120wxc.blog.163.com/blog/static/37788161201333112445844/ ARM(hisi)上面的profiling和valgri ...
 - AsMVC:一个简单的MVC框架的Java实现
			
当初看了<从零开始写一个Java Web框架>,也跟着写了一遍,但当时学艺不精,真正进脑子里的并不是很多,作者将依赖注入框架和MVC框架写在一起也给我造成了不小的困扰.最近刚好看了一遍sp ...
 - Android布局文件-错误
			
View requires API level 14 (current min is 8): <?xml version="1.0" encoding="utf-8 ...
 - Js打开新窗口拦截问题整理
			
一.js打开新窗口,经常被拦截 //js打开新窗口,经常被拦截 //指定本窗口打开,可以使用 window.open('http://www.tianma3798.cn', '_self'); //不 ...
 - c - 2/1, 3/2, 5/3, 8/5, 13/8...前20项的和
			
double pres(const int n) { ; //分子. ; //分母. ; double tmp; ; i <= n; i++) { sum += (numerator / den ...
 - MSSQL 字符串替换语句
			
MSSQL替换语句:update 表名 set 字段名=replace(cast(字段名 as varchar(8000)),'abc.com','123.com')例如:update PE_Arti ...
 - SVN库迁移整理方法总结
			
有时候需要从一台机器迁移svn存储库到另外一台机器,如果数据量非常大的话,没有好的方法是很不方便的,其实迁移svn跟迁移mysql差不多,也有导出导入的方案 以下是subversion官方推荐的备份方 ...
 - PHP 错误处理
			
PHP 错误处理 在 PHP 中,默认的错误处理很简单.一条错误消息会被发送到浏览器,这条消息带有文件名.行号以及描述错误的消息. PHP 错误处理 在创建脚本和 Web 应用程序时,错误处理是一个重 ...
 - angularjs使用directive实现分页组件
			
闲来没事,分享下项目中自己写的分页组件.来不及了,直接上车. 效果: 输入框可任意输入,并会自动提交到该页 html: <ul class="page clearfix"&g ...
 - Java前端Rsa公钥加密,后端Rsa私钥解密(目前还不支持中文加密解密,其他都行)
			
Base64工具类,可以让rsa编码的乱码变成一串字符序列 package com.utils; import java.io.ByteArrayInputStream; import java.io ...