zoukankan      html  css  js  c++  java
  • codeforces 711D Directed Roads(DFS)

    题目链接:http://codeforces.com/problemset/problem/711/D

    思路:由于每个点出度都为1,所以没有复杂的环中带环。DFS遍历,若为环则有2^k-2种,若为链则为2^k种。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=2e5+10;
    const int mod=1e9+7;
    int v[N],vis[N],num,times[N],c[N];
    ll ans=1;
    ll quickpow(ll a,ll b)
    {
        ll res=1;
        while(b)
        {
            if(b&1)
                res*=a;
            res%=mod;
            a*=a;
            a%=mod;
            b>>=1;
        }
        return res;
    }
    void dfs(ll i,ll x)
    {
        if(times[i])
        {
            if(times[i]==num)//如果属于本次遍历,则有环存在
            {
                ans*=quickpow(2,x-c[i])-2;//环部分
                ans%=mod;
                ans*=quickpow(2,c[i]);//链部分
                ans%=mod;
                return;
            }
            ans*=quickpow(2,x);//未找到环,只有链
            ans%=mod;
            return;
        }
        times[i]=num;
        c[i]=x;
        dfs(v[i],x+1);
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",v+i);
        for(int i=1;i<=n;i++)
        {
            if(!times[i])
                num++,dfs(i,0);
        }
        printf("%I64d
    ",ans);
        return 0;
    }
    


  • 相关阅读:
    Rocket
    Rocket
    Rocket
    Rocket
    Scala
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
  • 原文地址:https://www.cnblogs.com/westwind1005/p/5975200.html
Copyright © 2011-2022 走看看