codeforces Round#369 div2-D tDirected Roads

原创 2016年08月30日 00:20:50

题意:n个点n条有向边(无自环),求边的集合的方案数,使得翻转这些边的方向后无环。

题解:题目给出的图不会环套环(环套环的话,至少有一个点要有两个出度,但题目是每个点一个出度),所有直接求强连通分量,贡献分两种情况:

1.形成环的强连通:2^n-2(本身和所有边反向不合法,其余都合法);

2.单点的强连通:2(该点的出边对合法性无影响);

累乘即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>

using namespace std;

typedef long long LL;
const int M=1000000007;
const int N=400000+10;

vector<int>V[N];
int n;
int Time,dfn[N],low[N],sta[N],instack[N],g[N];
int belong[N],h,Col;
LL RP(LL a,LL b)
{
    LL Ans=1;
    for (;b;b>>=1){
        if (b&1)Ans=Ans*a%M;
        a=a*a%M;
    }
    return Ans;
}
void tarjan(int u)
{
    Time++;
    dfn[u]=low[u]=Time;
    sta[++h]=u;instack[u]=1;
    for (int i=0;i<V[u].size();i++){
        int v=V[u][i];
        if (!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }else if (instack[v]==1)low[u]=min(low[u],low[v]);
    }
    if (dfn[u]==low[u]){
        Col++;
        while (sta[h]!=u){instack[sta[h]]=-1;belong[sta[h]]=Col;h--;g[Col]++;}
        instack[sta[h]]=-1;belong[sta[h]]=Col;h--;g[Col]++;
    }
}
int main()
{
    //freopen("1.txt","r",stdin);
    scanf("%d",&n);
    for (int i=1;i<=n;i++){
        int a;scanf("%d",&a);
        V[i].push_back(a);
    }
    memset(g,0,sizeof g);
    memset(dfn,0,sizeof dfn);
    memset(low,0,sizeof low);
    memset(instack,0,sizeof instack);
    h=Time=Col=0;
    for (int i=1;i<=n;i++)if (!dfn[i])tarjan(i);
    LL Ans=1;
    for (int i=1;i<=Col;i++)if (g[i]>1){
        Ans=Ans*(RP(2,g[i])-2+M)%M;
    }else Ans=Ans*2%M;
    cout<<Ans<<endl;
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

构筑极致用户体验-ROADs

通信世界网消息(CWW) 信息时代发展到今天,物理世界和数字世界正在加速融合,人类社会正发生着剧烈的改变,人类的情感、财富、知识、历史……正在加速从线下转移到线上,以“0101”的形式被发送、传送、接...
  • holandstone
  • holandstone
  • 2015年10月29日 12:40
  • 2467

【codeforces 732E】【贪心 map乱搞】

传送门:http://codeforces.com/contest/732/problem/E 描述: E. Sockets time limit per t...
  • guhaiteng
  • guhaiteng
  • 2016年10月22日 15:32
  • 542

ACM刷题之POJ————Jungle Roads

Jungle Roads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25415   ...
  • xiaofeng187
  • xiaofeng187
  • 2017年03月17日 14:53
  • 159

codeforces上一种应对大测试数据debug方法

接触codeforces时间不长,也就参加了10场左右。之前有次比赛就出现了wa了一道题,在比赛结束后看测试数据log时,发现出错的那组用例是个超过一万行输入的情况,codeforces上的测试数据无...
  • qq_29070399
  • qq_29070399
  • 2017年02月03日 16:09
  • 762

关于codeforces比赛规则介绍(转载)

Codeforces 简称: cf(所以谈论cf的时候经常被误会成TX的那款游戏). 网址: codeforces.com   这是一个俄国的算法竞赛网站,由来自萨拉托夫州立大学、由Mike Mirz...
  • y990041769
  • y990041769
  • 2014年02月19日 08:41
  • 15548

python爬虫抓取codeforces分数

环境介绍 python 2.7.2 re 正则表达式库 urllib2 代码#coding:utf8 import sys import urllib2,redef getrating(name): ...
  • qscqesze
  • qscqesze
  • 2016年11月17日 22:02
  • 467

Codeforces 708D 费用流 (呃我们的考试题)

NB的题目背景 输入输出一样考试的时候貌似只有gzz一个人搞出来了 %gzz思路: 分情况讨论 add(x,y,C,E) C是费用 E是流量 1. f>c add(x,y,2,inf),...
  • qq_31785871
  • qq_31785871
  • 2017年01月05日 17:56
  • 729

【Codeforces708C】【树形dp】【贪心】Centroids

Centroids Time Limit: 4000MS Memory Limit: 524288KB 64bit IO Format: %I64d & %I64u ...
  • u011327397
  • u011327397
  • 2016年10月14日 11:24
  • 423

CodeForces 165C--字符串(暴力)

题意: 给一个数字 k (k k 的子串? 输入: 1       1010 2       01010 100   01010 输出: 6 4 0 分析:直接暴...
  • shao1996
  • shao1996
  • 2016年07月14日 16:08
  • 163

POJ-2421-Constructing Roads(最小生成树 普利姆)

D - Constructing Roads Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u...
  • qq_32680617
  • qq_32680617
  • 2016年05月21日 19:43
  • 313
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforces Round#369 div2-D tDirected Roads
举报原因:
原因补充:

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