• E. Number of Simple Paths 题解(思维)


    题目链接

    题目大意

    给你n个点((sum n<=2e5)),n条边,求有多少条路径

    题目思路

    要明白任意两点的路径只能是1条或者2条

    先topo找环(双向边也是可以找的)

    然后把环上的每个点当作一棵树的根,dfs求每棵树的节点

    设第一颗树的节点为tree[i]...以此类推

    pre[i]=tree[1]+.....tree[i-1]+tree[i]

    显然若两点位于不同子树,则路径为2,位于同一子树则路径为1

    代码

    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define fi first
    #define se second
    #define debug printf(" I am here
    ");
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    const int maxn=2e5+5,inf=0x3f3f3f3f,mod=1e9+7;
    const double eps=1e-10;
    int n;
    int head[maxn],cnt,deg[maxn];
    bool vis[maxn];
    vector<int> vec;
    int tree[maxn];
    int pre[maxn];
    struct edge{
        int to,next;
    }e[maxn<<1];
    void add(int u,int v){
        e[++cnt]={v,head[u]};
        head[u]=cnt;
        deg[v]++;
    }
    void topo(){
        queue<int> que;
        for(int i=1;i<=n;i++){
            if(deg[i]==1){
                que.push(i);
            }
        }
        while(!que.empty()){
            int x=que.front();
            que.pop();
            for(int i=head[x];i;i=e[i].next){
                deg[e[i].to]--;
                if(deg[e[i].to]==1){
                    que.push(e[i].to);
                }
            }
        }
    }
    void dfs(int id,int son,int fa){
        tree[id]++;
        for(int i=head[son];i;i=e[i].next){
            if(e[i].to==fa||vis[e[i].to]) continue;
            dfs(id,e[i].to,son);
        }
    }
    void init(){
        vec.clear();
        cnt=0;
        for(int i=1;i<=n;i++){
            deg[i]=tree[i]=head[i]=vis[i]=0;
        }
    }
    int main(){
        int _;scanf("%d",&_);
        while(_--){
            scanf("%d",&n);
            init();
            for(int i=1,u,v;i<=n;i++){
                scanf("%d%d",&u,&v);
                add(u,v),add(v,u);
            }
            topo();
            for(int i=1;i<=n;i++){
                if(deg[i]>=2){
                    vis[i]=1;
                    vec.push_back(i);
                }
            }
            int tot=0;
            for(int i=0;i<vec.size();i++){
                dfs(++tot,vec[i],vec[i]);
            }
            for(int i=1;i<=tot;i++){
                pre[i]=pre[i-1]+tree[i];
            }
            ll ans=0;
            for(int i=1;i<=tot;i++){
                ans+=1ll*tree[i]*(tree[i]-1)/2+1ll*2*(tree[i])*(pre[tot]-pre[i]);
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
    
    
  • 相关阅读:
    CentOS7.4部署Python3+Django+uWSGI+Nginx
    测试:ATM
    JDBC_增删改
    HTTP请求状态码
    Servlet2
    Java日期时间3
    Servlet1
    安装Tomcat
    Java日期时间2
    广度优先遍历
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/14038864.html
Copyright © 2020-2023  润新知