原题地址

今天翻看集训队巨佬写的一篇有关于树形动规的论文时看到了这道题,但感觉并不需要用动规,求出树的直径再暴力枚举一下就搞出来了。

其实是因为我太蔡了,看不懂大佬在写什么orz

代码实现如下:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, a, b) for (register int i = (a); i <= (b); i++) const int inf = 0x3f3f3f3f, maxn = 2e5 + ; int n, m, ans, tmp, str, end, num_edge = ;
int dis1[maxn], dis2[maxn], head[maxn]; struct node {
int to, dis, nxt;
}edge[maxn << ]; int MIN(int a, int b) {return a < b ? a : b;} void origin() {
memset(dis1, , sizeof(head));
memset(dis2, , sizeof(head));
memset(head, -, sizeof(head));
} int read() {
int x = , flag = ;
char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') {
flag = ;
ch = getchar();
}
while (ch >= '' && ch <= '') {
x = (x << ) + (x << ) + ch - '';
ch = getchar();
}
return flag ? -x : x;
} void addedge(int from, int to, int dis) {
edge[++num_edge].nxt = head[from];
edge[num_edge].to = to;
edge[num_edge].dis = dis;
head[from] = num_edge;
} void dfs1(int u, int fa) {
for (register int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].to;
if (v == fa) continue;
dis1[v] = dis1[u] + edge[i].dis;
if (dis1[v] > dis1[str]) str = v;
dfs1(v, u);
}
} void dfs2(int u, int fa) {
for (register int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].to;
if (v == fa) continue;
dis2[v] = dis2[u] + edge[i].dis;
if (dis2[v] > dis2[end]) end = v;
dfs2(v, u);
}
} void dfs3(int u, int fa) {
for (register int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].to;
if (v == fa) continue;
dis1[v] = dis1[u] + edge[i].dis;
dfs3(v, u);
}
} void dfs4(int u, int fa) {
for (register int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].to;
if (v == fa) continue;
dis2[v] = dis2[u] + edge[i].dis;
dfs4(v, u);
}
} void write(int x) {
if (x < ) {
putchar('-');
x = -x;
}
if (x > ) write(x / );
putchar(x % + '');
} signed main() {
origin();
n = read(), m = read();
rep(i, , m) {
int u, v, w;
u = read(), v = read(), w = read();
addedge(u, v, w);
addedge(v, u, w);
}
dfs1(, );
dfs2(str, );
ans = dis2[end];
memset(dis1, , sizeof(head));
memset(dis2, , sizeof(head));
dfs3(str, );
dfs4(end, );
rep(i, , n) {
int flag = MIN(dis1[i], dis2[i]);
if (flag > tmp) tmp = flag;
}
ans += tmp;
write(ans);
return ;
}

最新文章

  1. MVC项目中WebViewPage的实战应用
  2. 一文读懂UGC:互联网上的生态秘密
  3. iOS7以上图片模糊效果
  4. Python科学计算(一)环境简介——Anaconda Python
  5. 20160128.CCPP体系详解(0007天)
  6. php的session.serialize_handler
  7. href 里面 链接前面加/与不加的区别?(绝对路径与相对路径)
  8. Ubuntu下安装Mysql并使用
  9. 1.0.3-学习Opencv与MFC混合编程之---打开本地摄像头
  10. HDU 4951 Multiplication table 阅读题
  11. Repeater在无数据记录时显示暂无数据
  12. js原生设计模式——2面向对象编程之继承—new类式继承
  13. C# 构造tree菜单工具方法
  14. python机器学习-sklearn挖掘乳腺癌细胞(四)
  15. tomcat简单使用(一)
  16. 框架-Spring
  17. Tomcat下bootstrap启动分析
  18. 对Yii2中 yii\web\User的理解,和自建的app\models\User(基础版),frontend\models\User的应用原理
  19. C#字符串中特殊字符的转义
  20. Fanvas是一个把swf转为html5 canvas动画的系统

热门文章

  1. JAVAEE第四周
  2. MFC中创建自定义消息
  3. jQuery 命名空间的使用
  4. 第十五周翻译-《Pro SQL Server Internals, 2nd edition》
  5. 了解box-sizing 盒子模型
  6. wps实现自动编码
  7. 剑指offer第32题:把数组排成最小的数及关于list.sort()和sorted( Iterable object )函数的相关知识
  8. 获取input标签的值
  9. Python参数笔记
  10. fiddler模拟弱网测试点