• DIV3E 基环树


    #include<bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define rush! ios::sync_with_stdio(false);cin.tie(0);
    const int inf = 0x3f3f3f3f;
    const long long linf = 0x3f3f3f3f3f3f3f3f;
    vector<int >g[200005];
    typedef long long ll;
    const int N=200005;
    ll f[N];
     
    //void init(ll n){
    //    f[0]=1;
    //    for(ll i=1;i<=n;++i){
    //        f[i]=f[i-1]*i;
    //    }
    //}
    ll C(ll n){
        if( 2>n) return 0;
        return n*(n-1)/2;
    }
    int ind;
    int dfn[N],fa[N];
    int loop[N],cnt;
    int vis[N];
    void loops(int u){
        dfn[u]=++ind;
        for(auto i:g[u]){
            if(i==fa[u])continue;
            if(dfn[i]){
                if(dfn[i]<dfn[u])continue;
                loop[++cnt]=i;
                vis[i]=1;
                for(;i!=u;i=fa[i]){
                    loop[++cnt]=fa[i];
                    vis[fa[i]]=1;
                }
                return ;
            }
            else{
                fa[i]=u;
                loops(i);
            }
        }
    }
    ll dfs(int u,int fa){
        ll res=1;
        for(auto i:g[u]){
            if(i!=fa&&!vis[i]){
                res+=dfs(i,u);
            }
        }
        return res;
    }
    void solve(){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            ind=0;
            dfn[i]=0,fa[i]=0;
            loop[i]=0;
            cnt=0;
            vis[i]=0;
            g[i].clear();
        }
        for(int i=1;i<=n;i++){
            int x,y;
             cin>>x>>y;
             g[x].push_back(y);
             g[y].push_back(x);
        }
        ll ans=C(n)*2;
    //    cout<<ans<<endl;
        loops(1);
        for(int i=1;i<=cnt;i++){
            ans-=C(dfs(loop[i],-1));
        }
        cout<<ans<<endl;
    }
    int main(){
    
        int t;
        cin>>t;
    //    cout<<C(5,2);
        while(t--){
            solve();
        }
    }
    rush!
  • 相关阅读:
    java方法参数传值传引用的一点看法
    Oracle触发器介绍
    CASE WHEN
    group by ,order by ,having
    Java中使用正则表达式
    Oracle 9i 分析函数参考手册
    ORACLE round 与 trunc 的区别
    oracle的默认表名长度(30)
    order by 使用索引的情况
    解析oracle的ROWNUM 作者: chen_liang
  • 原文地址:https://www.cnblogs.com/LH2000/p/14267408.html
Copyright © 2020-2023  润新知