ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

E. Number of Simple Paths(环基树 + 思维)

2020-11-25 20:05:15  阅读:189  来源: 互联网

标签:Paths fx Simple fy Number long int num maxn


Codeforces Round #686 (Div. 3)E. Number of Simple Paths

题意

给你n个点n条边的图,让你求树上的简单路径数。

简单路径:从a->b的方法,需要注意的是1->2>3,3->2->1算一种

思路

显然建成后的图是一棵树多了一条边,这种图又叫环基树。

从下图开始分析该题:

在这里插入图片描述

我们假设这个环的每一个点都是一棵树,我们建图。

在每个以环上的点为根的树上的任意两个点只有\(C_n^2\)的取法

其他的任意两个点间的取法都是有两种路径共计\(C_n^2 * 2\)。

我们先假设任意两个点间都有两种到达方法那么,\(ans = C_n^2\)

然后我们再减去只有一种方法的路径,即为所求。

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;
//#define int long long
const int maxn = 2e5 + 10;
int deg[maxn], bfs[maxn];
vector<int>edge[maxn];

int f[maxn], num[maxn];
void init(int n) {
    for (int i = 1; i <= n; ++i) {
        f[i] = i; num[i] = 1;
    }
}

int find(int x) {
    return f[x] == x ? x : f[x] = find(f[x]);
}

bool Union(int x, int y) {
    int fx = find(x);
    int fy = find(y);
    if (fx == fy) return 0;
    if (num[fx] > num[fy]) swap(fx, fy);
    num[fy] += num[fx];
    f[fx] = fy;
    return 1;
}

bool is_root(int x) {
    return f[x] == x ? 1 : 0;
}

void solve() {
    int n; cin >> n;
    init(n);
    for (int i = 1; i <= n; ++i) {
        deg[i] = 0; edge[i].clear();
    }
    for (int i = 1; i <= n; ++i) {
        int u, v; cin >> u >> v;
        edge[u].push_back(v);
        edge[v].push_back(u);
        ++deg[u]; ++deg[v];
    }
    int cnt = 0;
    for (int i = 1; i <= n; ++i)
        if (deg[i] == 1) {
            bfs[++cnt] = i;
            --deg[i];
        }
    for (int i = 1; i <= cnt; ++i) {
        int u = bfs[i];
        for (auto v : edge[u]) {
            --deg[v];
            Union(u, v);
            if (deg[v] == 1) {
                bfs[++cnt] = v;
            }
        }
    }
    LL ans = n * (n  - 1LL);
    for (int i = 1; i <= n; ++i) {
        if (is_root(i)) {
            ans -= num[i] * (num[i] - 1LL) / 2;
        }
    }
    cout << ans << endl;
}


signed main() {
    int T; cin >> T;
    while (T--) {
        solve();
    }
}

标签:Paths,fx,Simple,fy,Number,long,int,num,maxn
来源: https://www.cnblogs.com/waryan/p/14038085.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有