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+组合数学 图论)

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

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

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

[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 369 D.Directed Roads(数学,判断图中每个环的边数)

题目链接 D. Directed Roads time limit per test 2 seconds memory limit per test 256 megaby...
  • fouzhe
  • fouzhe
  • 2016年09月03日 10:16
  • 243

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的距离分别不...
  • yxg_123
  • yxg_123
  • 2017年03月05日 14:12
  • 191

Codeforces Round #369 (Div. 2) -- C. Coloring Trees (三维DP)

大体题意: 给你n 个树,你要给这些树染色,  标号是0 表示这棵树还没有染色,标号不是0 表示这棵树已经染色 不需要再染,这片树的美丽程度是  连续相同颜色的数目! 告诉你指定美丽程度K,和  最多...

Codeforces Round #369 (Div. 2) 手速练习赛

一不小心打开cf发现有一场div2在20:00,感觉非常资瓷,作为一个unrated狗感觉是个很好的涨分机会,然后就去注册了。        打比赛前发现注册8000+,害怕。。。        比赛...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces Round #369 (Div. 2) D. Directed Roads
举报原因:
原因补充:

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