51Nod-1737-配对

2023-10-10 12:30
文章标签 51nod 配对 1737

本文主要是介绍51Nod-1737-配对,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ACM模版

描述

描述

题解

这个问题实际上是找树的重心,只要找到重心 dfs 遍历一遍求各个路径的权值,各点到重心的权值之和就是最大距离总和。至于怎么找重心,其实也是一遍 dfs,有固定的模版,代码不难理解。说以这个问题只需要先 dfs 一遍找到树的重心,然后再 dfs_ 一遍求各个点到重心的路径权值,最后,累加各个点的路径权值即可。

代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>#define pb push_back
#define mp make_pairusing namespace std;typedef long long ll;
typedef pair<int, int> pll;const int INF = 0x3f3f3f3f;
const int MAXN = 1e5 + 10;int n;
ll wr[MAXN];    //  wr[i] i 到重心 zx 的带权路径长度/*  树的重心*  初始化 vis[] son[] 为 0*  初始化 sz 为 INF*/
int zx, sz;
int son[MAXN], vis[MAXN];
vector<pll> edge[MAXN];void init()
{for (int i = 1; i <= n; i++){edge[i].clear();}memset(vis, 0, sizeof(vis));memset(wr, 0, sizeof(wr));sz = INF;zx = -1;
}void dfs(int r)
{vis[r] = 1;son[r] = 0;int tmp = 0;for (int i = 0; i < edge[r].size(); i++){int v = edge[r][i].second;if (!vis[v]){dfs(v);son[r] += son[v] + 1;tmp = max(tmp, son[v] + 1);}}tmp = max(tmp, n - son[r] - 1);if (tmp < sz){zx = r;sz = tmp;}
}void dfs_(int x)
{vis[x] = 1;for (int i = 0; i < edge[x].size(); i++){int v = edge[x][i].second;if (!vis[v]){wr[v] = wr[x] + edge[x][i].first;dfs_(v);}}
}int main()
{while (~scanf("%d", &n)){init();for (int i = 0; i < n - 1; i++){int u, v, w;scanf("%d%d%d", &u, &v, &w);edge[u].pb(mp(w, v));edge[v].pb(mp(w, u));}dfs(1);memset(vis, 0, sizeof(vis));dfs_(zx);ll ans = 0;for (int i = 1; i <= n; i++){ans += wr[i];}printf("%lld\n", ans);}return 0;
}

参考

《树的重心》

这篇关于51Nod-1737-配对的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/180439

相关文章

【51nod】算法马拉松4 F 移数字 【快速求N!%P】【FFT】

传送门:【51nod】算法马拉松4 F 移数字 涉及知识点:多项式求逆,多项式除法,多点插值,阶乘取模。 对于N!%P,复杂度为 O(N−−√log2N−−√) O(\sqrt N \log^2\sqrt N)。 但常数巨大,和暴力算实际复杂度只相差常数= = 这个是可以扩展到组合数取模的~ my  code: my~~code: #include <stdio.h>#includ

【BLE】四.SMP安全配对详解

设备配对流程 SMP专业术语 Paring(配对): 配对能力交换,设备认证,密钥生成,连接加密以及机密信息分发等 过程 Bonding(绑定) 配对中会生成一个长期密钥(LTK,long-term Key),双方把LTK存储在Flash,那么这两个设备再次重连就可跳过配对流程,且直接使用LTK对蓝牙连接进行加密; 不存储LTK(不分发LTK),paring完成后连接也是加密的,但重连

28. 双耳配对 - 配置

1. 概述 通过MAC地址的最后一位的奇偶来判断左右耳 2. 验证 右耳:奇数(主耳)-》BT ADDR: 12:42:22:34:34:6d 左耳:偶数(从耳)-》BT ADDR: 12:42:22:34:34:6c

NYOJ【括号配对问题】

描述 现在,有一行括号序列,请你检查这行括号是否配对。 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则

蓝牙的配对

官方蓝牙Api 蓝牙之开启和关闭 蓝牙之扫描可连接设备 通过反射BluetoothDevice中的“createBond”和“removeBond”两个函数实现配对和移除配对 创建配对 /*** 创建配对** @param device*/@RequiresApi(api = Build.VERSION_CODES.KITKAT)public void CreateBond(Blu

独木舟(51Nod-1432)

题目 n个人,已知每个人体重。独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟? 输入 第一行包含两个正整数n (0<n<=10000)和m (0<m<=2000000000),表示人数和独木舟的承重。 接下来n行,每行一个正整数,表示每个人的体重。体重不超过1000000000,并且每个人的体

emacs evil-matchit实现verilog配对的代码跳转

背景emacs插件evil-matchit参考文档 背景 vim里常使用%进行跳转。遇到代码段较长的情况,跳转方便而且有助于debug。 vim 实现begin end 配对 使用matchit插件 - 岁月长河 - 博客园 http://www.cnblogs.com/air-of-code/p/4733151.html emacs怎么搞? emacs插件evil-

Android 蓝牙配对Settings应用里面的简要流程记录

Android 蓝牙配对Settings应用里面的简要流程记录 文章目录 Android 蓝牙配对Settings应用里面的简要流程记录一、前言二、Settings蓝牙配对的关键代码1、接收蓝牙请求的地方 AndroidManifest.xml2、BluetoothPairingRequest3、BluetoothPairingService4、BluetoothPairingDialog

NYOJ-2-括号配对问题-2013年09月09日09:32:18

括号配对问题 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 3 描述 现在,有一行括号序列,请你检查这行括号是否配对。 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]",

ny2括号配对问题

括号配对问题 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 3 描述 现在,有一行括号序列,请你检查这行括号是否配对。 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]",