zoukankan      html  css  js  c++  java
  • C. Friends

    C. Friends

    题意

    对于任一点,求到此点距离不超过6的节点数。

    分析

    第一次dfs,形成一个以 1 为根的有向树,设 down[i][j] 为以i为根节点,距离 i 点距离不超过 j 的节点数(这些节点都是 i 的子孙节点)
    第二次dfs,设 up[i][j] 以 i 为起点,距离 i 点距离不超过 j 的非子孙节点的个数,可根据 down 求得。

    code

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<set>
    #include<map>
    #include<algorithm>
    using namespace std;
    typedef pair<int, int> P;
    typedef long long ll;
    const int INF = 1e9;
    const int MAXN = 1e5 + 10;
    
    int up[MAXN][10], down[MAXN][10];
    vector<int> G[MAXN];
    void dfs1(int pre, int u)
    {
        down[u][0] = 1;
        for(int i = 0; i < G[u].size(); i++)
        {
            int v = G[u][i];
            if(v == pre) continue;
            dfs1(u, v);
            for(int j = 1; j <= 6; j++) down[u][j] += down[v][j - 1];
        }
    }
    void dfs2(int pre, int u)
    {
        up[u][0] = 1;
        if(u != pre) for(int i = 1; i <= 6; i++)
            up[u][i] += up[pre][i - 1] + down[pre][i - 1] - down[u][i > 2 ? i - 2 : 0];
        for(int i = 0; i < G[u].size(); i++)
        {
            int v = G[u][i];
            if(v != pre) dfs2(u, v);
        }
    }
    int main()
    {
        int T, c = 1;
        scanf("%d", &T);
        while(T--)
        {
            int n;
            scanf("%d", &n);
            for(int i = 0; i <= n; i++) G[i].clear();
            memset(up, 0, sizeof up);
            memset(down, 0, sizeof down);
            for(int i = 0; i < n - 1; i++)
            {
                int x, y;
                scanf("%d%d", &x, &y);
                G[x].push_back(y);
                G[y].push_back(x);
            }
            dfs1(1, 1); dfs2(1, 1);
            printf("Case #%d:
    ", c++);
            for(int i = 1; i <= n; i++)
            {
                int res = 0;
                for(int j = 1; j <= 6; j++) res += up[i][j] + down[i][j];
                printf("%d
    ", res);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    JS对象、包装类
    js刷题网站
    typeof 返回的数据类型
    一文讲懂什么是函数柯里化,柯里化的目的及其代码实现
    JS 中深拷贝的几种实现方法
    JavaScript 开发的45个经典技巧
    JavaScript中的delete操作符
    IE下iframe不能正常加载,显示空白
    使用Costura.Fody插件将自己写的程序打包成一个可以独立运行的EXE文件
    list获取所有上级
  • 原文地址:https://www.cnblogs.com/ftae/p/6791432.html
Copyright © 2011-2022 走看看