CodeForces 711 D.Directed Roads(组合数学)
2018-01-13 21:02
411 查看
Description
给出一个n个点n条边的有向图,第i个点连向第pi个点,现可以给边集的一个子集进行反转,即改变有向边的方向,问有多少种方案可以使得该有向图无环
Input
第一行一整数n,之后输入n个整数pi表示i到pi有一条有向边(2≤n≤2⋅105,1≤pi≤n,pi≠i)
Output
输出方案数,结果模109+7
Sample Input
3
2 3 1
Sample Output
6
Solution
由于每个点的出度只有1,故不会出现两个环有交集的情况,也不会出现对某个环反转后与原先一些非环边组成新环的情况,故对每个环单独破坏即可,一个长度为x的环,现在要给其反转,只要不是不反转或者全部反转,均可破坏该环,方案数为2x−2,而对于非环边,反不反转不影响,假设有y条非环边,则方案数为2y,找环直接dfs给每个点打标记并记录该点与起点的距离即可,当前访问的点之前被标记过说明成环,当前距离减去之前到该点的距离即为环的大小
Code
给出一个n个点n条边的有向图,第i个点连向第pi个点,现可以给边集的一个子集进行反转,即改变有向边的方向,问有多少种方案可以使得该有向图无环
Input
第一行一整数n,之后输入n个整数pi表示i到pi有一条有向边(2≤n≤2⋅105,1≤pi≤n,pi≠i)
Output
输出方案数,结果模109+7
Sample Input
3
2 3 1
Sample Output
6
Solution
由于每个点的出度只有1,故不会出现两个环有交集的情况,也不会出现对某个环反转后与原先一些非环边组成新环的情况,故对每个环单独破坏即可,一个长度为x的环,现在要给其反转,只要不是不反转或者全部反转,均可破坏该环,方案数为2x−2,而对于非环边,反不反转不影响,假设有y条非环边,则方案数为2y,找环直接dfs给每个点打标记并记录该点与起点的距离即可,当前访问的点之前被标记过说明成环,当前距离减去之前到该点的距离即为环的大小
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<ctime> using namespace std; typedef long long ll; typedef pair<int,int>P; const int INF=0x3f3f3f3f,maxn=200005; #define mod 1000000007 int n,p[maxn],f[maxn],num,ans,vis[maxn],dep[maxn]; void dfs(int u,int cnt,int tar) { dep[u]=cnt; vis[u]=tar; if(!vis[p[u]])dfs(p[u],cnt+1,tar); else if(vis[p[u]]==tar) { num-=(cnt-dep[p[u]]+1); ans=(ll)ans*(f[cnt-dep[p[u]]+1]+mod-2)%mod; } } int main() { f[0]=1; for(int i=1;i<=2e5;i++)f[i]=2*f[i-1]%mod; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++)scanf("%d",&p[i]); num=n;ans=1; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) if(!vis[i])dfs(i,1,i); ans=(ll)ans*f[num]%mod; printf("%d\n",ans); } return 0; }
相关文章推荐
- Codeforces 711 C. Coloring Trees (dp)
- Codeforces Round #369 (div.2) 即 Codeforces 711
- CodeForces 711 E.ZS and The Birthday Paradox(组合数学)
- 【Codeforces 711 C】+ dp
- Codeforces 711 D. Directed Roads (DFS判环)
- codeforces 711 A. Bus to Udayland
- codeforces 711B B. Chris and Magic Square(水题)
- codeforces 711 B. Chris and Magic Square (简单)
- codeforces 711D D. Directed Roads(dfs)
- Codeforces 711 E. ZS and The Birthday Paradox(数学)——Codeforces Round #369 (Div. 2)
- 【Codeforces 711 D D. Directed Roads】 + DFS
- CodeForces - 595B Pasha and Phone (数学技巧)好题
- codeforces 711A.Bus to Udayland 【水题】
- codeforces 678C Joty and Chocolate
- Codeforces 426C Sereja and Swaps【思维】
- CodeForces 295C - Greg and Friends BFS找最短路径
- codeforces 551B
- Codeforces 27B Tournament(dfs,判断有向图中点的连通性)
- (one day one problem) codeforces 468/problem/B Two Sets (并查集)
- Codeforces-591C题解