zoukankan      html  css  js  c++  java
  • hdu 5379

    题意:有一棵有n个节点的树,有编号1~n的n个数字要放到树上。且要满足三个要求:
    1.树的每一个节点仅仅放一个数字
    2.树的随意一个节点的全部直接孩子节点上面放的数字排序后是连续的
    3.一棵子树的全部节点上面放的数字排序后是连续的
    问有多少种不同的放法,结果取模1e9+7。
    题解:由于子树的数字排序后都是连续的,所以能够转化为求分割连续区间的方法数。要加开栈外挂才干过。

    #pragma comment(linker, "/STACK:102400000,102400000")
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    using namespace std;
    const int N = 100005;
    const long long MOD = 1e9 + 7;
    vector<int> g[N];
    long long A[N], res;
    
    int dfs(int u, int fa) {
        int tot = 1, ns = 0, nt = 0;//包括根节点的全部节点,直接孩子节点,子树个数
        int n = g[u].size();
        for (int i = 0; i < n; i++) {
            int v = g[u][i];
            if (v == fa)
                continue;
            ns++;   
            int num = dfs(v, u);
            if (num > 1)
                nt++;
            tot += num;
        }
        if (nt > 2)//有大于两个子树无法保证分割后连续
            return res = 0;
        if (nt)//有一个或两个子树分割方法数都仅仅有两个
            res = res * 2 % MOD;
        res = res * A[ns - nt] % MOD;//当个节点可自由排序
        return tot;
    }
    
    int main() {
        A[0] = 1;
        for (int i = 1; i < N; i++)
            A[i] = A[i - 1] * i % MOD;
        int t, cas = 1, n;
        scanf("%d", &t);
        while (t--) {
            scanf("%d", &n);
            for (int i = 0; i <= n; i++)
                g[i].clear();
            int a, b;
            for (int i = 0; i < n - 1; i++) {
                scanf("%d%d", &a, &b);
                g[a].push_back(b);
                g[b].push_back(a);  
            }
            if (n == 1) {
                printf("Case #%d: 1
    ", cas++);
                continue;   
            }
            res = 1;
            dfs(1, 0);
            printf("Case #%d: %lld
    ", cas++, res * 2 % MOD);//根节点左右两种切法
        }
        return 0;
    }
  • 相关阅读:
    UVa 1354 天平难题 (枚举二叉树)
    广西邀请赛总结
    UVa 12118 检查员的难题 (dfs判连通, 构造欧拉通路)
    UVA
    Uva 127 "Accordian" Patience (模拟)
    UVA 10539 Almost Prime Numbers( 素数因子)
    HDU 1272 小希的迷宫(并查集)
    HDU 1213 How Many Tables (并查集)
    POJ 2236 Wireless Network(并查集)
    HDU 1233 还是畅通工程 ( Kruskal或Prim)
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7236069.html
Copyright © 2011-2022 走看看