[CF711D]Directed Roads(强联通分量,计数)

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

熄灯了明天填坑…

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <iomanip>
  4 #include <cstring>
  5 #include <climits>
  6 #include <complex>
  7 #include <fstream>
  8 #include <cassert>
  9 #include <cstdio>
 10 #include <bitset>
 11 #include <vector>
 12 #include <deque>
 13 #include <queue>
 14 #include <stack>
 15 #include <ctime>
 16 #include <set>
 17 #include <map>
 18 #include <cmath>
 19 using namespace std;
 20 #define fr first
 21 #define sc second
 22 #define cl clear
 23 #define BUG puts("here!!!")
 24 #define W(a) while(a--)
 25 #define pb(a) push_back(a)
 26 #define Rint(a) scanf("%d", &a)
 27 #define Rll(a) scanf("%I64d", &a)
 28 #define Rs(a) scanf("%s", a)
 29 #define Cin(a) cin >> a
 30 #define FRead() freopen("in", "r", stdin)
 31 #define FWrite() freopen("out", "w", stdout)
 32 #define Rep(i, len) for(int i = 0; i < (len); i++)
 33 #define For(i, a, len) for(int i = (a); i < (len); i++)
 34 #define Cls(a) memset((a), 0, sizeof(a))
 35 #define Clr(a, x) memset((a), (x), sizeof(a))
 36 #define Full(a) memset((a), 0x7f7f7f, sizeof(a))
 37 #define lrt rt << 1
 38 #define rrt rt << 1 | 1
 39 #define pi 3.14159265359
 40 #define RT return
 41 #define lowbit(x) x & (-x)
 42 #define onecnt(x) __builtin_popcount(x)
 43 typedef long long LL;
 44 typedef long double LD;
 45 typedef unsigned long long ULL;
 46 typedef pair<int, int> pii;
 47 typedef pair<string, int> psi;
 48 typedef pair<LL, LL> pll;
 49 typedef map<string, int> msi;
 50 typedef vector<int> vi;
 51 typedef vector<LL> vl;
 52 typedef vector<vl> vvl;
 53 typedef vector<bool> vb;
 54
 55 const int maxn = 200200;
 56 const LL mod = 1e9+7;
 57 LL ret;
 58
 59 typedef struct Edge {
 60     int u;
 61     int v;
 62     int next;
 63     Edge() { next = -1; }
 64 }Edge;
 65
 66 int head[maxn], ecnt;
 67 Edge edge[maxn];
 68 int n, m;
 69
 70 int bcnt, dindex;
 71 int dfn[maxn], low[maxn];
 72 int stk[maxn], top;
 73 int belong[maxn];
 74 int in[maxn], out[maxn];
 75 bool instk[maxn];
 76 int cnt[maxn];
 77
 78 void init() {
 79     memset(edge, 0, sizeof(edge));
 80     memset(head, -1, sizeof(head));
 81     memset(instk, 0, sizeof(instk));
 82     memset(dfn, 0, sizeof(dfn));
 83     memset(low, 0, sizeof(low));
 84     memset(belong, 0, sizeof(belong));
 85     memset(in, 0, sizeof(in));
 86     memset(out, 0, sizeof(out));
 87     ecnt = top = bcnt = dindex = 0;
 88 }
 89
 90 void adde(int uu, int vv) {
 91     edge[ecnt].u = uu;
 92     edge[ecnt].v = vv;
 93     edge[ecnt].next = head[uu];
 94     head[uu] = ecnt++;
 95 }
 96
 97 void tarjan(int u) {
 98     int v = u;
 99     dfn[u] = low[u] = ++dindex;
100     stk[++top] = u;
101     instk[u] = 1;
102     for(int i = head[u]; ~i; i=edge[i].next) {
103         v = edge[i].v;
104         if(!dfn[v]) {
105             tarjan(v);
106             low[u] = min(low[u], low[v]);
107         }
108         else if(instk[v]) low[u] = min(low[u], dfn[v]);
109     }
110     if(dfn[u] == low[u]) {
111         bcnt++;
112         do {
113             v = stk[top--];
114             instk[v] = 0;
115             belong[v] = bcnt;
116             cnt[bcnt]++;
117         } while(v != u);
118     }
119 }
120
121 LL quickmul(LL x, LL n) {
122     LL ans = 1;
123     while(n) {
124         if(n & 1) ans = (ans * x) % mod;
125         x = x * x % mod;
126         n >>= 1;
127     }
128     return ans;
129 }
130
131
132 int main() {
133     // FRead();
134     while(~Rint(n)) {
135         ret = 1; Cls(cnt);
136         init();
137         int v;
138         For(i, 1, n+1) {
139             Rint(v);
140             adde(i, v);
141         }
142         For(i, 1, n+1) if(!dfn[i]) tarjan(i);
143         LL tmp = 0;
144         For(i, 1, bcnt+1) {
145             if(cnt[i] > 1) {
146                 ret = (ret * (quickmul(2, cnt[i])-2+mod))%mod;
147                 tmp = (tmp + cnt[i]) % mod;
148             }
149         }
150         ret = (ret * quickmul(2, n-tmp)) % mod;
151         cout << ret << endl;
152     }
153     RT 0;
154 }
时间: 2024-10-08 11:13:08

[CF711D]Directed Roads(强联通分量,计数)的相关文章

POJ 2186 Popular cows(Kosaraju+强联通分量模板)

题目链接:http://poj.org/problem?id=2186 题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为牛C是红人,那么牛A也认为牛C是红人.求被其他所有牛认为是红牛的牛的总数. 解题思路:把所有牛看成顶点,把有序对(A,B)看成从A到B的有向边,那么题目就变成了求所有顶点都可到达的顶点的总数.我们可以得到一个结论,如果一个强连通分量里有一头牛被认为是红人,那么该强联通分量里的所有牛都是红人,这显然是

Light OJ 1034 - Hit the Light Switches(强联通分量)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1034 题目大意:有n盏灯,有m个关系, 关系a,b表示如果a灯开关打开那么b灯也会亮起来, 现在求至少需要打开多少开关使所有灯都亮. 题目思路:先由强联通分量缩点, 得到DAG图, 然后根据DAG图,求出有多少入度为0的点, 即为所求. 代码如下: #include<bits/stdc++.h> using namespace std; const int N = 1000

[BZOJ1051] [HAOI2006] 受欢迎的牛 (强联通分量)

Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头 牛被所有的牛认为是受欢迎的. Input 第一行两个数N,M. 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可 能出现多个A,B) Output 一个数,即有多少头牛被所有的牛认为是受欢迎的. Sample Input 3

【小结】强联通分量分解

强联通分量 在一个有向图的顶点子集S中,对?(u,v),如果都能找到一条从u到v的路径,那么就称S是强联通的.如果向S中加入任何一个其他顶点后S都不再是强联通的,就称S时原图的一个强联通分量. 显然,如果把所有的强联通分量都缩点,原图将变成一个DAG SCC的求解可通过两次dfs实现,第一次在原图中后续遍历,标号:第二遍将所有边反向后,从编号最大的点开始遍历,每次都可得到一个SCC. #include <cstdio> #include <cstring> #include <

[CF #236 (Div. 2) E] Strictly Positive Matrix(强联通分量)

题目:http://codeforces.com/contest/402/problem/E 题意:给你一个矩阵a,判断是否存在k,使得a^k这个矩阵全部元素都大于0 分析:把矩阵当作01矩阵,超过1的都当作1,那么a矩阵可表示一个有向图的走一次的连通性,则a^k表示有向图走K次的连通性.既然要求最后都没0,即走了K次后,每个点都能互通,这也说明这个图必然是只有一个强联通分量.于是判断k的存在有无,也就是判断a矩阵表示的有向图是不是只有一个强联通分量.

51nod 1076 2条不相交的路径 无向图强联通分量 trajan算法

1076 2条不相交的路径 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 给出一个无向图G的顶点V和边E.进行Q次查询,查询从G的某个顶点V[s]到另一个顶点V[t],是否存在2条不相交的路径.(两条路径不经过相同的边) (注,无向图中不存在重边,也就是说确定起点和终点,他们之间最多只有1条路) Input 第1行:2个数M N,中间用空格分开,M是顶点的数量,N是边的数量.(2 <= M <= 25000, 1 <= N <=

爆零后的感受外加一道强联通分量HDU 4635的题解

今天又爆零了,又是又,怎么又是又,爆零爆多了,又也就经常挂嘴边了,看到这句话,你一定很想说一句"",弱菜被骂傻,也很正常啦. 如果你不开心,可以考虑往下看. 翻到E(HDU 4635 Strongly connected)题,这么短的题目,肯定要先看啦.然后D(LightOJ 1229),然后C(ZOJ 2243),然后F(HDU 4711),然后B(CodeForces 385D),然后看A(HDU 3889)好吧,我承认,A题看了一眼就不看了,B题一看是线段什么有点几何的味道就果断

POJ 2186-Popular Cows (图论-强联通分量Korasaju算法)

题目链接:http://poj.org/problem?id=2186 题目大意:有n头牛和m对关系, 每一对关系有两个数(a, b)代表a牛认为b牛是“受欢迎”的,且这种关系具有传递性, 如果a牛认为b牛“受欢迎”, b牛认为c牛“受欢迎”, 那么a牛也认为c牛“受欢迎”. 现在想知道有多少头牛受除他本身外其他所有牛的欢迎? 解题思路:如果有两头或者多头牛受除他本身外其他所有牛的欢迎, 那么在这两头或者多头牛之中, 任意一头牛也受两头或者多头牛中别的牛的欢迎, 即这两头或者多头牛同属于一个强联

【POJ1236】Network of Schools 强联通分量缩点(本文kosaraju)

/*不要说这题多水之类的--我只是想记一下kosaraju这种屌炸天的dfs序延伸算法(说不定能加到我的ygylca里面)*/ 题意神马的都不说了,好吧,就是给你个图,n个点,然后n行每行都描述该点的出边,图建完了,然后缩点,然后问多少个点没有入度,再问需要加几条边可以让图变强联通图. 强联通图:图中任意两点之间都能互相到达(前提得是有向图你懂的,无向图就有点乱了,根本不要算法了,暴搜就好了) 强联通分量:同强联通图,不过是图中一部分. 缩点,把一个分量视为一个点,缩起来(一般不缩,都是记录每个

HAOI2006受欢迎的牛(强联通分量)

求出强联通分量之后判断出度为0的点有几个,有1个就输出这个分量的点的数目,否则输出0: var i,j,n,m,x,y,ans1,ans2,t,cnt,top:longint; head,next,go,sta,inp:array[0..50010] of longint; low,dfn,scc,s:array[0..10000] of longint; flag:array[0..10000] of boolean; function min(x,y:longint):longint; be