zoukankan      html  css  js  c++  java
  • CodeForces 690C2 Brain Network (medium)(树上DP)

    题意:给定一棵树中,让你计算它的直径,也就是两点间的最大距离。

    析:就是一个树上DP,用两次BFS或都一次DFS就可以搞定。但两次的时间是一样的。

    代码如下:

    #include<bits/stdc++.h>
    
    using namespace std;
    const int maxn = 1e5 + 5;
    vector<int> G[maxn];
    int f[maxn], g[maxn], l[maxn];
    
    int dfs(int root, int fa){
        if(f[root] != -1)  return f[root];
        if(!G[root].size())  return f[root] = 0;
        int ans = root, m = 0, mm = 0;
        for(int i = 0; i < G[root].size(); ++i){
            int u = G[root][i];
            if(u == fa)   continue;
            if(dfs(u, root) + 1 > m){
                m = f[u] + 1;
                ans = u;
            }
        }
        l[root] = ans;
        for(int i = 0; i < G[root].size(); ++i){
            int u = G[root][i];
            if(f[u] + 1 > mm && u != l[root])  mm = f[u] + 1;
        }
        g[root] = mm;
        return f[root] =  m;
    }
    
    int main(){
        int n, m, u, v;
        cin >> n >> m;
        while(m--){
            scanf("%d %d", &u, &v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
    
        memset(f, -1, sizeof(f));
        int ans = 0;
        for(int i = 1; i <= n; ++i)
            if(f[i] == -1)  dfs(i, -1);
        for(int i = 1; i <= n; ++i)   ans = max(ans, f[i]+g[i]);
        cout << ans << endl;
        return 0;
    }
    

     两次BFS:

    #include<bits/stdc++.h>
    
    using namespace std;
    const int maxn = 1e5 + 5;
    int d[maxn];
    vector<int> G[maxn];
    int vis[maxn], vvis[maxn];
    
    int bfs(int root){
        memset(vis, 0, sizeof(vis));
        memset(d, 0, sizeof(d));
        vis[root] = 1;  vvis[root] = 1;
        queue<int> q; q.push(root);
        int ans = root, mmax = 0;
        while(!q.empty()){
            root = q.front();  q.pop();
            for(int i = 0; i < G[root].size(); ++i){
                int u = G[root][i];
                if(vis[u])  continue;
                q.push(u);
                vis[u] = vvis[u] = 1;
                d[u] = d[root] + 1;
                if(mmax < d[u]){
                    mmax = d[u];
                    ans = u;
                }
            }
        }
        return ans;
    }
    
    int solve(int root){
        int u = bfs(root);
        int v = bfs(u);
        return d[v];
    }
    
    int main(){
        int n, m, u, v;
        cin >> n >> m;
        for(int i = 0; i < m; ++i){
            scanf("%d %d", &u, &v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
    
        memset(vvis, 0, sizeof(vvis));
        int ans = 0;
        for(int i = 1; i <= n; ++i)
            if(!vvis[i])   ans = max(ans, solve(i));
        cout << ans << endl;
        return 0;
    }
    
  • 相关阅读:
    SpringBoot 项目 打包为 Docker镜像
    0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate.
    注册k8s到rancher时 agent pods一直处于containercreating状态
    linux查看磁盘使用情况
    linux修改系统时间、时区
    windows 添加路由
    Notebook Docker 安装spark环境
    openlayers6加载天地图混乱问题
    Oracle 高效分页
    VSCode 终端无法打开
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5660521.html
Copyright © 2011-2022 走看看