codeforces1454E. Number of Simple Paths(基环图 + 思维)

本文介绍了一种计算基环图中简单路径数量的方法。基环图是一种特殊类型的图,仅比树多一条边。文章详细阐述了如何通过算法区分不同情况来计算路径数目,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给一个基环图(比一棵树多一条边的图),问图中简单路径的个数

思路:

基环图有且只有一个环,现讨论图中两个不同的点

(1)两个点都在环上,有2条路径

(2)一个在环上,一个不在环上,有2条路径

(3)都不在环上,但在同一棵子树中,有1条路径

(4)都不在环上,也不在同一棵子树中,2条路经

所以单独算出(3)就可以了,用(n - 1)* n 减去

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const ll inf = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll N = 2e5 + 10;

vector<ll>mp[N];
ll n, deg[N], cnt;
bool vis[N];

void topo() {
    queue<ll>q;
    for(ll i = 1; i <= n; ++i)
        if(deg[i] == 1) deg[i]--, q.push(i);
    while(!q.empty()) {
        ll tp = q.front();
        q.pop();
        vis[tp] = 1;
        ll sz = mp[tp].size();
        for(ll i = 0; i < sz; ++i) {
            ll v = mp[tp][i];
            if(vis[v]) continue;
            deg[v]--;
            if(deg[v] == 1) q.push(v), deg[v]--;
        }
    }
}

void dfs(int u, int fa) {
    cnt++;
    int siz = mp[u].size();
    for(int i = 0; i < siz; ++i) {
        int v = mp[u][i];
        if(v == fa || deg[v]) continue;
        dfs(v, u);
    }
}

int main() {
    ll t, u, v;
    scanf("%lld", &t);
    while(t--) {
        scanf("%lld", &n);
        for(ll i = 1; i <= n; ++i) mp[i].clear();
        for(ll i = 1; i <= n; ++i) deg[i] = 0;
        for(ll i = 1; i <= n; ++i) {
            scanf("%lld%lld", &u, &v);
            mp[u].emplace_back(v);
            mp[v].emplace_back(u);
            deg[u]++, deg[v]++;
        }
        for(ll i = 1; i <= n; ++i) vis[i] = 0;
        topo();
        ll ans = (n - 1) * n;
        for(int i = 1; i <= n; ++i) {
            if(deg[i]) {
                cnt = 0, dfs(i, 0);
                ans -= cnt * (cnt - 1) / 2;
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值