To 洛谷.1395 会议 To CODEVS.3029 设置位置

题目描述

有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1。现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那么村长应该要把会议地点设置在哪个村民的家中,并且这个距离总和最小是多少?若有多个节点都满足条件,则选择节点编号最小的那个点。

输入输出格式

输入格式:

第一行。一个数n,表示有n个村民。

接下来n-1行,每行两个数字a和b,表示村民a的家和村民b的家之间存在一条路径。

输出格式:

一行输出两个数字x和y

x表示村长将会在哪个村民家中举办会议

y表示距离之和的最小值

输入输出样例

输入样例#1:

4
1 2
2 3
3 4
输出样例#1:

2 4

说明

【数据范围】

70%数据n<=1000

100%数据n<=50000

思路:

  求树的重心,然后求重心到每个点的距离。(树的重心 百度百科

  如果用n遍spfa会超时。

代码:

1.dfs

 #include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=,INF=0x3f3f3f3f; int n,cnt,Ans,Min,size=INF,H[N<<],son[N],dep[N];
bool vis[N];
struct Edge
{
int to,nxt;
}e[N<<]; void read(int &now)
{
now=;bool f=;char c=getchar();
while(c>''||c<'')
{
if(c=='-')f=;
c=getchar();
}
while(c>=''&&c<='')now=(now<<)+(now<<)+c-'',c=getchar();
now= f?-now:now;
} void AddEdge(int u,int v)
{
e[++cnt].to = v;
e[cnt].nxt = H[u];
H[u] = cnt;
} void DFS(int cur)
{//求树的重心
vis[cur]=;
son[cur]=;
int tmp=;
for(int i=H[cur];i;i=e[i].nxt)
{
if(!vis[e[i].to])
{
DFS(e[i].to);
son[cur]+=son[e[i].to]+;
tmp=max(tmp,son[e[i].to]+);
}
}
tmp=max(tmp,n-son[cur]-);
if(size>tmp || tmp==size&&Ans>cur)
{
Ans=cur;
size=tmp;
}
} void DFSforDeep(int x,int y,int d)
{
dep[x]=d;
for(int i=H[x];i;i=e[i].nxt)
if(y != e[i].to)
DFSforDeep(e[i].to,x,d+);
} int main()
{
read(n);
int x,y;
for(int i=;i<n;++i)
{
read(x);read(y);
AddEdge(x,y);
AddEdge(y,x);
}
DFS();
DFSforDeep(Ans,Ans,);
for(int i=;i<=n;++i)
Min+=abs(dep[Ans]-dep[i]);
printf("%d %d",Ans,Min);
return ;
}

AC

2.70分的spfa

 #include<queue>
#include<cstdio>
using namespace std;
const int N=,INF=0x3f3f3f3f; int n,cnt,Ans,Min=INF,H[N<<],Dist[N];
bool Exist[N];
queue<int>q;
struct Edge
{
int to,nxt;
}e[N<<]; void read(int &now)
{
now=;bool f=;char c=getchar();
while(c>''||c<'')
{
if(c=='-')f=;
c=getchar();
}
while(c>=''&&c<='')now=(now<<)+(now<<)+c-'',c=getchar();
now= f?-now:now;
} void AddEdge(int u,int v)
{
e[++cnt].to = v;
e[cnt].nxt = H[u];
H[u] = cnt;
} void spfa(int x)
{
for(int i=;i<=n;++i)
Exist[i]=,Dist[i]=INF;
Dist[x]=;
Exist[x]=;
q.push(x);
while(!q.empty())
{
int cur=q.front();
q.pop();
Exist[cur]=;
for(int i=H[cur];i;i=e[i].nxt)
{
int to=e[i].to;
if(Dist[to]<=Dist[cur]+)continue;
Dist[to]=Dist[cur]+;
if(!Exist[to])
q.push(to),Exist[to]=;
}
}
} int main()
{
read(n);
int x,y;
for(int i=;i<n;++i)
{
read(x);read(y);
AddEdge(x,y);
AddEdge(y,x);
}
for(int i=;i<=n;++i)
{
spfa(i);
int sum=;bool OK=;
for(int j=;j<=n;++j)
if(Dist[j]==INF)
{
OK=;break;//防止累加INF溢出,不知道有没有用
}
else
sum+=Dist[j];
if(sum<Min && OK)
Min=sum,Ans=i;
}
printf("%d %d",Ans,Min);
return ;
}

TLE

洛谷P1395 会议(CODEVS.3029.设置位置)(求树的重心)的更多相关文章

  1. 洛谷P1395 会议 题解

    $题目$ 为什么这个题会有图论的标签啊,虽然图论也包括找树的重心,可是这很容易让人联想到最短路,但不得不说,这是一个典型的找树的重心模板题. 树的重心是什么? 找到一个点,其所有的子树中最大的子树节点 ...

  2. 洛谷P1395 会议 (树的重心)

    这道题考察了树的重心的性质,所有点到中心的距离之和是最小的,所以我们一遍dfs求出树的重心,在跑一次dfs统计距离之和. 1 #include<bits/stdc++.h> 2 using ...

  3. 【洛谷5439】【XR-2】永恒(树链剖分,线段树)

    [洛谷5439][XR-2]永恒(树链剖分,线段树) 题面 洛谷 题解 首先两个点的\(LCP\)就是\(Trie\)树上的\(LCA\)的深度. 考虑一对点的贡献,如果这两个点不具有祖先关系,那么这 ...

  4. 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]

    P2668 斗地主 326通过 2.6K提交 题目提供者洛谷OnlineJudge 标签搜索/枚举NOIp提高组2015 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 出现未知错误是说梗啊 ...

  5. 洛谷P2922 [USACO008DEC] 秘密消息Secret Message [Trie树]

    洛谷传送门,BZOJ传送门 秘密消息Secret Message Description     贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息.     信息是二进制的,共有M(1≤M≤5 ...

  6. bzoj 3295 (洛谷3157、3193) [Cqoi2011]动态逆序对——树套树 / CDQ分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3295 题目--洛谷3157:https://www.luogu.org/problemnew ...

  7. P1395 会议(求树的重心)

    P1395 会议 题目描述 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那么 ...

  8. 洛谷P2633 Count on a tree(主席树,倍增LCA)

    洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...

  9. 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)

    To 洛谷.2982 慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows con ...

随机推荐

  1. 编码器AE & VAE

    学习总结于国立台湾大学 :李宏毅老师 自编码器 AE (Auto-encoder)    & 变分自动编码器VAE(Variational Auto-encoder)             ...

  2. Account的简单架构

    前几天,有园友私下问我,博客中的AccountDemo后端架构为什么是那样的,是不是分层太多太冗余,故这里简单介绍下.先看解决方案工程截图: 每个工程的含义,见https://www.cnblogs. ...

  3. python风流史

    python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  4. ajax post 传递数组参数

    1.前言 此文章仅作为记录,方便查阅. 2.代码 javascript: var idArr = ['one','two','Three']; $.ajax({ type: 'POST', data ...

  5. STM32学习及应用笔记二:一次运算符优先级造成的错误

    本人在最近一个项目的开发中,出现一个应为疏忽运算符优先级造成的问题,检查了很久才发现问题,所以觉得运算符的优先级问题还是有必要再研究一下.具体的问题是这样的,我采集了传感器的原始数据,然后会对数据进行 ...

  6. NodeJs>------->>第一章:Node.js介绍

    一:章节前言 二:Node.js概述 1:使用node.js能够解决什么问题 2:实现高性能服务器 3:非阻塞型I/O及事件环形机制 4:node.js适合开发的程序 三:node.js安装 一.No ...

  7. js之观察者模式

    观察者模式: 大体上是, 1.松耦合的代码: 2.一对多的关系: 3.主体状态变化时,所有依赖被通知: 4.主体和观察者互不知晓. 基本上,满足上面四点的,就可以算是观察者模式了.来看一个demo, ...

  8. 激活函数--(Sigmoid,tanh,Relu,maxout)

    Question? 激活函数是什么? 激活函数有什么用? 激活函数怎么用? 激活函数有哪几种?各自特点及其使用场景? 1.激活函数 1.1激活函数是什么? 激活函数的主要作用是提供网络的非线性建模能力 ...

  9. 《剑指offer》青蛙跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 很裸的斐波那契数列. class Solution { public: int jumpFloor ...

  10. 【图的遍历】广度优先遍历(DFS)、深度优先遍历(BFS)及其应用

    无向图满足约束条件的路径 •[目的]:掌握深度优先遍历算法在求解图路径搜索问题的应用 [内容]:编写一个程序,设计相关算法,从无向图G中找出满足如下条件的所有路径:  (1)给定起点u和终点v.  ( ...