【CF711D】Directed Roads(想法题,环,强连通分量)

题意:

  给一张N个点N条有向边的图,边可以逆向。问任意逆向若干条边使得这张图无环的方案数(mod 1e9+7)。

n<=200000

思路:三个样例给的好 找规律方便很多

易得有N点的环有(2^n)-2中改法,除了不改和都改

剩下的都是链,设除环外还有K个点,他们的总贡献就是2^k,因为都是一条边相连接怎么改也没有环

CF上快速幂要写在外面不然会出现奇奇怪怪的CE

 1 const mo=1000000007;
 2 var head,vet,next,stack,low,dfn,b,s,flag:array[1..500000]of longint;
 3     n,tot,i,id,time,top,x,m:longint;
 4     ans,f,tmp:int64;
 5
 6 procedure add(a,b:longint);
 7 begin
 8  inc(tot);
 9  next[tot]:=head[a];
10  vet[tot]:=b;
11  head[a]:=tot;
12 end;
13
14 function min(x,y:longint):longint;
15 begin
16  if x<y then exit(x);
17  exit(y);
18 end;
19
20 procedure dfs(u:longint);
21 var e,v:longint;
22 begin
23  flag[u]:=1;
24  inc(top); stack[top]:=u;
25  inc(time); dfn[u]:=time; low[u]:=time;
26  e:=head[u];
27  while e<>0 do
28  begin
29   v:=vet[e];
30   if flag[v]=0 then
31   begin
32    dfs(v);
33    low[u]:=min(low[u],low[v]);
34   end
35    else if s[v]=0 then low[u]:=min(low[u],low[v]);
36   e:=next[e];
37  end;
38  if dfn[u]=low[u] then
39  begin
40   inc(id); s[u]:=id; inc(b[id]);
41   while (top>0)and(stack[top]<>u) do
42   begin
43    s[stack[top]]:=id;
44    inc(b[id]);
45    stack[top]:=0;
46    dec(top);
47   end;
48   stack[top]:=0; dec(top);
49  end;
50 end;
51
52 begin
53
54  readln(n);
55  for i:=1 to n do
56  begin
57   read(x);
58   add(i,x);
59  end;
60  for i:=1 to n do
61   if flag[i]=0 then dfs(i);
62  m:=0;
63  for i:=1 to n do
64   if b[s[i]]=1 then m:=m+1;
65  ans:=1;
66  for i:=1 to id do
67   if b[i]>1 then
68   begin
69    f:=1; tmp:=2;
70    while b[i]>0 do
71    begin
72     if b[i] mod 2=1 then f:=f*tmp mod mo;
73     tmp:=tmp*tmp mod mo;
74     b[i]:=b[i] div 2;
75    end;
76    ans:=(ans*(f-2)) mod mo;
77   end;
78   ans:=(ans+mo) mod mo;
79   f:=1; tmp:=2;
80   while m>0 do
81   begin
82    if m mod 2=1 then f:=f*tmp mod mo;
83    tmp:=tmp*tmp mod mo;
84    m:=m div 2;
85   end;
86   ans:=ans*f mod mo;
87  writeln(ans);
88
89 end.
时间: 2024-10-07 05:02:49

【CF711D】Directed Roads(想法题,环,强连通分量)的相关文章

[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 #in

CodeForces 711D Directed Roads (DFS判环+计数)

题意:给定一个有向图,然后你可能改变某一些边的方向,然后就形成一种新图,让你求最多有多少种无环图. 析:假设这个图中没有环,那么有多少种呢?也就是说每一边都有两种放法,一共有2^x种,x是边数,那么如果有环呢?假设x是这个连通块的边数, y是这个环的边数,那么就一共有2^x * (2 ^ y - 2) 种,减去这两种就是一边也不变,和所有的边都就变,这样就形成环了. 那么怎么计算呢?这个题的边很特殊,所以我们可以利用这个特征,我们在每个连通块时,用vis记录一下开始的父结点,用cnt记录每一个到

Codeforces 711 D. Directed Roads (DFS判环)

题目链接:http://codeforces.com/problemset/problem/711/D 给你一个n个节点n条边的有向图,可以把一条边反向,现在问有多少种方式可以使这个图没有环. 每个连通量必然有一个环,dfs的时候算出连通量中点的个数y,算出连通量的环中点的个数x,所以这个连通量不成环的答案是2^(y - x) * (2^x - 2). 最后每个连通量的答案相乘即可. 1 //#pragma comment(linker, "/STACK:102400000, 102400000

Codeforces Round #369 (Div. 2) D. Directed Roads dfs求某个联通块的在环上的点的数量

D. Directed Roads ZS the Coder and Chris the Baboon has explored Udayland for quite some time. They realize that it consists of n towns numbered from 1to n. There are n directed roads in the Udayland. i-th of them goes from town i to some other town 

POJ3114 Countries in War (强连通分量 + 缩点 + 最短路径 + 好题)

题目链接 题意是说在几个邮局之间传送一份信件,如果出发点和终止点在同一个国家传递,则时间为0,否则让你求花费最少时间,如果不能传到,则输出Nao e possivel entregar a carta.判断邮局是否在同一个国家的依据是发出的信件可以相互到达. 如果直接求最短路则无法判断两个邮局是否在同一个国家,判断两个邮局是否属于同一个国家的标志是在这个国家邮局间可以相互到达,那么这就是强连通了,所以要先缩点判读邮局是否在同一个国家,如果不是,则重新建图,建图的时候要维护好边权,求出最短边权,在

有向图的强连通分量(tarjan算法)

强连通分量 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.有向图的极大强连通子图,称为强连通分量(strongly connected components). 考虑强连通分量C,设其中第一个被发现的点为x,则,C中其他的点都是x的后代.我们希望在x访问完成时立即输出C(可以同时记录C,输出代表

Kosaraju算法解析: 求解图的强连通分量

1. 定义 连通分量:在无向图中,即为连通子图. 上图中,总共有四个连通分量.顶点A.B.C.D构成了一个连通分量,顶点E构成了一个连通分量,顶点F,G和H,I分别构成了两个连通分量. 强连通分量:有向图中,尽可能多的若干顶点组成的子图中,这些顶点都是相互可到达的,则这些顶点成为一个强连通分量. 上图中有三个强连通分量,分别是a.b.e以及f.g和c.d.h. 2. 连通分量的求解方法 对于一个无向图的连通分量,从连通分量的任意一个顶点开始,进行一次DFS,一定能遍历这个连通分量的所有顶点.所以

强连通分量!

强连通分量 有向图中, u可达v不一定意味着v可达u. 相互可达则属于同一个强连通分量(Strongly Connected Component, SCC) 有向图和它的转置的强连通分量相同所有SCC构成一个DAG 1.强连通图.在一个强连通图中,任意两个点都通过一定路径互相连通.比如图一是一个强连通图,而图二不是.因为没有一条路使得点4到达点1.2或3. 2.强连通分量.在一个非强连通图中极大的强连通子图就是该图的强连通分量.比如图三中子图{1,2,3,5}是一个强连通分量,子图{4}是一个强

POJ_2186_Popular Cows_强连通分量

Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 30680   Accepted: 12445 Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you are given up to M (1 <= M &

POJ 3177 Redundant Paths(强连通分量)

题目链接:http://poj.org/problem?id=3177 题目大意是一个无向图给你n个点m条边,让你求出最少加多少条边 可以让任意两个点相通两条及以上的路线(每条路线点可以重复,但是每条路径上不能有重边),简单来说就是让你加最少的边使这个图变成一个双连通图. 首先用tarjan来缩点,可以得到一个新的无环图,要是只有一个强连通分量,那本身就是一个双连通图.要是多个强连通分量,那我们可以考虑缩点后度数为1的点(肯定是由这个点开始连新边最优),那我们假设数出度数为1的点的个数为cnt,