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;
    }
    
  • 相关阅读:
    JAVA设计模式之策略模式
    Outlook邮箱配置
    Linux命令
    开发工具使用技巧
    java连接VMware虚拟机Oracle数据库问题
    C#创建带有界面交互的windows服务
    Google Galaxy Nexus刷系统
    业务逻辑?到底是什么
    发明轮子
    IBM服务器机组初始设置
  • 原文地址:https://www.cnblogs.com/ftae/p/6791432.html
Copyright © 2011-2022 走看看