Codeforces Round #369 (Div. 2) D. Directed Roads

原创 2016年08月30日 23:28:15

题目链接

题意:给你一个n个点,n条有向边的图,你可以使任意条边反向,但是每条边只能反向一次,请求出使图不存在环的所有方案数量

仔细思考我们发现,对于一个点数为x的环,除去全部不反向和全部反向两种情况,其他的所有方案总数为(2^x)-2种

对于不在环上的边,无论反向还是不反向对环的存在都是没有影响的,因此如果有y条边不在环上,就有2^y种情况

最后将所有的情况乘起来就可以了,环的存在需要dfs预处理一下

——————因为这里每个点的出度只有1,所有要成环肯定是沿着给定nxt找下去找得到。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define mod 1000000007
const int maxn=200005;
int nxt[maxn],vis[maxn],loop[maxn];
int n,tot;
void findloop(int x){
   loop[tot]=1;
   vis[x]=3;
   while(vis[nxt[x]]!=3){
    x=nxt[x];
    vis[x]=3;
    loop[tot]++;
   }
}
void dfs(int x){
    vis[x]=2;
    if(!vis[nxt[x]])dfs(nxt[x]);
    if(vis[nxt[x]]==2){
        tot++;
        findloop(nxt[x]);
    }
    //if(vis[nxt[x]]==1||vis[nxt[x]]==3)
        vis[x]=1;
}
LL quickpowmod(LL x,LL y,LL mo)
{
      LL ret = 1;
      while(y){
         if(y&1)
             ret = ret*x%mo;
         x = x*x%mo;
         y >>= 1;
     }
   return ret;
 }

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&nxt[i]);
    tot=0;
    for(int i=1;i<=n;i++){
        if(!vis[i])dfs(i);
    }
    LL ans=1;
    for(int i=1;i<=tot;i++){
        ans=ans*((quickpowmod(2,loop[i],mod)-2+mod)%mod)%mod;
        n-=loop[i];
    }
    ans=ans*quickpowmod(2,n,mod)%mod;
    cout<<ans<<endl;
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Codeforces Round #369 (Div. 2) -- D. Directed Roads (DFS找环)

大体题意: 给你一个有向图,可能会有环,你的操作是反向一条路,求得使得图中没有环所有方案数? 思路: 假如图中没有环的话,有n条边,答案就是2^n 如果有个m边的环,间接法考虑,总方案是2^m...

Codeforces Round #369 (Div. 2) D. Directed Roads (dfs+组合数学 图论)

传送门:D. Directed Roads 描述: D. Directed Roads time limit per test 2 seconds memory li...

[Codeforces Round #369 (Div. 2)D. Directed Roads]Tarjan强连通分量+组合计数

[Codeforces Round #369 (Div. 2)D. Directed Roads]Tarjan强连通分量题目链接:[Codeforces Round #369 (Div. 2)D. D...

Codeforces #369 div2 D.Directed Roads

codeforces

CodeForces 369 div2 D Directed Roads 图论 数论

D. Directed Roads time limit per test 2 seconds memory limit per test 256 megabytes ...

Codeforces Round #369 (Div. 2) A~D

A. Bus to Udayland time limit per test 2 seconds memory limit per test 256 megabytes input sta...

Codeforces Round #369 (Div. 2) A~D

前言:这场又蹦了。。。还是老老实实补题吧。 A:水题就不说了#include #define rep(i,a,n) for (int i=a;i>n){ int ans=0;

Codeforces Round #186 (Div. 2) D Ilya and Roads DP 单调优化

刚开始犯2去想肿么建图了。 dp还是很好想: 定义 dp[i][x]  表示从 1 到 i 被覆盖了x个洞需要的最小花费。转移方程很简单, 对于 j >i 的有:dp[j][  x + j...

Codeforces Round #302 (Div. 2) D - Destroying Roads 图论,最短路

题目链接:http://codeforces.com/contest/544/problem/D题意:有n个城镇,m条边权为1的双向边 让你破坏最多的道路,使得从s1到t1,从s2到t2的距离分别不...

Codeforces Round #369 (Div. 2)

这比赛比较坑啊,看了一下A题过了7000+人,B题直接只剩2000+人。这套题的B题非常坑,很多陷阱。 A: 水题 B: 这题就是一个幻方,但是非常坑,有这么几个坑点:1.如果n==1,随便输出一个数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)