zoukankan      html  css  js  c++  java
  • 牛客国庆 Day4 H 巧妙的用树的直径!!

    传送门  https://ac.nowcoder.com/acm/contest/1109#question

    刚开始吓得我以为要搞树分治,差点就捞了哦!

     这个定理要铭记于心啊!!!

    #include<cstring>
    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<cstdio>
    #define maxn 100010
    using namespace std;
    typedef long long ll;
    int n, m;
    struct Node {
    	int p;
    	int len;
    	Node(int a, int b) :p(a), len(b) {}
    };
    vector<Node>G[maxn];
    void insert(int be, int en, int len) {
    	G[be].push_back(Node(en, len));
    }
    ll dis[maxn];
    ll dis1[maxn];
    ll dis2[maxn];
    int dfs(int x, ll dep, int fa, ll d[]) {
    	d[x] = dep;
    	for (int i = 0; i < G[x].size(); i++) {
    		int p = G[x][i].p;
    		if (p == fa) continue;
    		dfs(p, dep + G[x][i].len, x, d);
    	}
    	return 0;
    }
    int main() {
    	while (~scanf("%d", &n)) {
    		int be, en, len;
    		for (int i = 0; i < n - 1; i++){
    			scanf("%d %d %d", &be, &en, &len);
    			insert(be, en, len);
    			insert(en, be, len);
    		}
    		int s=1, t=1;
    		dfs(1, 0, -1, dis);
    		for (int i = 1; i <= n; i++) {
    			if (dis[i] > dis[s]) s = i;
    		}
    		dfs(s, 0, -1, dis1);//dis1从s开始
    		for (int i = 1; i <= n; i++) {
    			if (dis1[i] > dis1[t]) t = i;
    		}
    		//t从s开始
    		dfs(t, 0, -1, dis2);
    		ll ans = 0;
    		for (int i = 1; i <= n; i++) {
    			ans += max(dis1[i], dis2[i]);
    		}
    		ans -= dis1[t];
    		printf("%lld
    ", ans);
    		for (int i = 0; i < maxn; i++)  G[i].clear();
    	}
    	return 0;
    }
    

      

    寻找真正的热爱
  • 相关阅读:
    python之-- 异常
    实现Asp.Net Mvc4多级Views目录
    MVC控制下输出图片、javascript与json格式
    公共增删改查(MVC+三层架构)
    工厂方法模式
    简单工厂模式
    单例模式
    JavaScript正则表达式
    JavaScript对象与数组
    JavaScript数组排序
  • 原文地址:https://www.cnblogs.com/lesning/p/11623088.html
Copyright © 2011-2022 走看看