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. #ifndef详解

    #ifndef 是"if not defined"的简写,是预处理功能(宏定义.文件包含.条件编译)当中的条件编译,可以根据是否已经定义了一个变量来进行分支选择,其作用是: 1.防 ...

  2. centos6.7环境下kvm虚拟机之virt-install和virsh及virt-manager工具的使用

    virt-install工具的使用: virt-install是一个命令行工具,它能够为KVM.Xen或其它支持libvrit API的hypervisor创建虚拟机并完成GuestOS安装:此外,它 ...

  3. 如何选取一个神经网络中的超参数hyper-parameters

    1.什么是超参数 所谓超参数,就是机器学习模型里面的框架参数.比如聚类方法里面类的个数,或者话题模型里面话题的个数等等,都称为超参数.它们跟训练过程中学习的参数(权重)是不一样的,通常是手工设定的,经 ...

  4. Java用四种方法实现阶乘n! (factorial)

    1. 引言 实现阶乘的方法很多,这边介绍四种方法,分别是递归,尾递归,循环和BigDecimal. 2. 代码 public class Test { public static void main( ...

  5. 使用@property - 廖雪峰的官方网站

    使用@property 阅读: 20616 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9 ...

  6. 性能测试二十六:环境部署之Mysql+Redis+Tomcat环境整合

    系统中使用了缓存+数据库,通用读取数据规则1.先从缓存读数据,如果有,直接返回数据:2.如果没有,去数据库中读,然后再插入到缓存中,再返回数据 Mysql+Redis+Tomcat环境整合 1.修改P ...

  7. python接口自动化测试十五:解决密码动态,无法登录情况

    解决问题:每次密码都是变化的,无法通过账号密码登录 (总不能每次去fiddler复制吧????) 解决思路: 1.先用selenium调用浏览器(不会selenium的自己想办法了), 2.登录后从浏 ...

  8. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

  9. ERP完善合同起草(二十八)

    前端的代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CRMCont ...

  10. D 矩阵快速幂

    Description <英雄联盟>(简称LOL)是由美国Riot Games开发,腾讯游戏运营的英雄对战网游.<英雄联盟>除了即时战略.团队作战外,还拥有特色的英雄.自动匹配 ...