洛谷P1395 会议(CODEVS.3029.设置位置)(求树的重心)
To 洛谷.1395 会议 To CODEVS.3029 设置位置
题目描述
有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1。现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那么村长应该要把会议地点设置在哪个村民的家中,并且这个距离总和最小是多少?若有多个节点都满足条件,则选择节点编号最小的那个点。
输入输出格式
输入格式:
第一行。一个数n,表示有n个村民。
接下来n-1行,每行两个数字a和b,表示村民a的家和村民b的家之间存在一条路径。
输出格式:
一行输出两个数字x和y
x表示村长将会在哪个村民家中举办会议
y表示距离之和的最小值
输入输出样例
4
1 2
2 3
3 4
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.设置位置)(求树的重心)的更多相关文章
- 洛谷P1395 会议 题解
$题目$ 为什么这个题会有图论的标签啊,虽然图论也包括找树的重心,可是这很容易让人联想到最短路,但不得不说,这是一个典型的找树的重心模板题. 树的重心是什么? 找到一个点,其所有的子树中最大的子树节点 ...
- 洛谷P1395 会议 (树的重心)
这道题考察了树的重心的性质,所有点到中心的距离之和是最小的,所以我们一遍dfs求出树的重心,在跑一次dfs统计距离之和. 1 #include<bits/stdc++.h> 2 using ...
- 【洛谷5439】【XR-2】永恒(树链剖分,线段树)
[洛谷5439][XR-2]永恒(树链剖分,线段树) 题面 洛谷 题解 首先两个点的\(LCP\)就是\(Trie\)树上的\(LCA\)的深度. 考虑一对点的贡献,如果这两个点不具有祖先关系,那么这 ...
- 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]
P2668 斗地主 326通过 2.6K提交 题目提供者洛谷OnlineJudge 标签搜索/枚举NOIp提高组2015 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 出现未知错误是说梗啊 ...
- 洛谷P2922 [USACO008DEC] 秘密消息Secret Message [Trie树]
洛谷传送门,BZOJ传送门 秘密消息Secret Message Description 贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息. 信息是二进制的,共有M(1≤M≤5 ...
- bzoj 3295 (洛谷3157、3193) [Cqoi2011]动态逆序对——树套树 / CDQ分治
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3295 题目--洛谷3157:https://www.luogu.org/problemnew ...
- P1395 会议(求树的重心)
P1395 会议 题目描述 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那么 ...
- 洛谷P2633 Count on a tree(主席树,倍增LCA)
洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...
- 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)
To 洛谷.2982 慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows con ...
随机推荐
- MR数据生成工具指向目录
mrDataTidy_SaveTwoDays.jar 原始路径 :D:\太原MR数据\一天数据整理 目标路径 : D:\MR现场数据整理\保存两天_整理后数据 例如 当前时间:2017-5-17 10 ...
- openstack常见问题解决方法总结
一.创建实例失败: 首先用下面命令查看服务是否正常 1. nova-manage service list 如果不正常,则使用下面命令重启,如果还不行,则查看日志, 1. service nova-a ...
- c++ 简单静态链表
所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表.对各结点既可以通过上一个结点的next指针去访问,也可以直接通过结构体变量名s1, s2, s3去访问 ...
- saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入
saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入salt的返回值写入mysql数据库:可参考:https://docs.saltstack.com/en/lat ...
- Java通过BCrypt加密
一.概述 在用户模块,对于用户密码的保护,通常都会进行加密.我们通常对密码进行加密,然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否 ...
- 目标检测--Scalable Object Detection using Deep Neural Networks(CVPR 2014)
Scalable Object Detection using Deep Neural Networks 作者: Dumitru Erhan, Christian Szegedy, Alexander ...
- pytorch实现花朵数据集读取
import os from PIL import Image from torch.utils import data import numpy as np from torchvision imp ...
- cf220b
不知道为什么线段树区间更新专题里有这题.. 可以用莫队解,也可以直接开数组解 /* n个询问,m个元素 O(m*m):记录每个元素出现次数,筛掉出现次数小于数值的数 */ #include<io ...
- Nginx部署多个网站
为节省资源,通常一个服务器会运行多个网站,通常一个服务一个IP,多个域名共用一个IP,多个域名共用一个端口(通常是80端口). 这时候需要一台服务器部署多个网站,多个网站共用一个IP,共用一个80端口 ...
- winform连接oracle时Oracle.DataAccess.dll版本问题 Silverlight
1.通用TestOracle.zip部署到iis上,或直接运行程序测试当前全局程序集 protected void Button1_Click(object sender, EventArgs e) ...