zoukankan      html  css  js  c++  java
  • bzoj1509

    树的直径

    我先开始以为是个图,想想并不知道什么求图的直径的方法,结果是棵树

    那么直觉告诉我们是在直径上面,实际上就是直径+min(i->u,i->v),扫一遍就行了

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 200010;
    namespace IO 
    {
        const int Maxlen = N;
        char buf[Maxlen], *C = buf;
        int Len;
        inline void read_in()
        {
            Len = fread(C, 1, Maxlen, stdin);
            buf[Len] = '';
        }
        inline void fread(int &x) 
        {
            x = 0;
            int f = 1;
            while (*C < '0' || '9' < *C) { if(*C == '-') f = -1; ++C; }
            while ('0' <= *C && *C <= '9') x = (x << 1) + (x << 3) + *C - '0', ++C;
            x *= f;
        }
        inline void read(int &x)
        {
            x = 0;
            int f = 1; char c = getchar();
            while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); }
            while(c >= '0' && c <= '9') { x = (x << 1) + (x << 3) + c - '0'; c = getchar(); }
            x *= f;
        }
        inline void read(long long &x)
        {
            x = 0;
            long long f = 1; char c = getchar();
            while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); }
            while(c >= '0' && c <= '9') { x = (x << 1ll) + (x << 3ll) + c - '0'; c = getchar(); }
            x *= f;
        } 
    } using namespace IO;
    struct edge {
        int to;
        long long w;
        edge(int to = 0, long long w = 0) : to(to), w(w) {}
    };
    int n, m, root;
    long long ans;
    vector<edge> G[N];
    long long f[N], g[N], d[N];
    void dfs(int u, int last, long long d[])
    {
        if(d[u] > d[root]) root = u;
        for(int i = 0; i < G[u].size(); ++i)
        {
            edge e = G[u][i];
            if(e.to == last) continue;
            d[e.to] = d[u] + e.w;
            dfs(e.to, u, d);
        }    
    }
    int main()
    {
        read(n);
        read(m);
        for(int i = 1; i <= m; ++i)
        {
            int u, v; 
            long long w;
            read(u);
            read(v);
            read(w);
            G[u].push_back(edge(v, w));
            G[v].push_back(edge(u, w));
        }
        dfs(1, 0, f);
        int u = root;
        root = 0;
        dfs(u, 0, g);
        long long dis = g[root];
        u = root;
        root = 0;
        dfs(u, 0, d);
        for(int i = 1; i <= n; ++i) ans = max(ans, dis + min(d[i], g[i]));
        printf("%lld
    ", ans);
        return 0;
    }
    View Code
  • 相关阅读:
    windows对象的属性和方法
    JavaScript事件处理
    HTML骨架-深入理解
    js阻止元素的默认事件与冒泡事件
    CSS3之背景色渐变
    CSS3匹配屏幕横竖状态
    LINUX系统GIT使用教程
    博客园文章页显示布局调整
    JS编码解码详解
    JS设置获取cookies
  • 原文地址:https://www.cnblogs.com/19992147orz/p/7380151.html
Copyright © 2011-2022 走看看