codeforces 711 D.Directed Roads(tarjan 强连通分量 )
题目链接:http://codeforces.com/contest/711/problem/D
题目大意:Udayland有一些小镇,小镇和小镇之间连接着路,在某些区域内,如果从小镇Ai开始,找到一个环,环中每个小镇只经过一次,最终回到了Ai,那么认为这个环是混乱的,现在需要治理这种混乱。可以做的操作是改变环上某个小镇Ak到小镇Aj路的方向,使得无法从Ai开始绕这个环再次回到Ai,那么可以认为混乱被治理,问需有多少种改变路径方向的方案可以使得整个Udayland不混乱?求出方案数。
题解思路:涉及到环,首先要求出强联通分量个数,建图套一下tarjan的模板。对于每个强连通分量,在此题意的限制条件下,其边的数量为每个强连通分量的点的数量,那么从tarjan中可以轻易得到边的数量,每条边的方向可以是正反两种,由于可以改变边的方向,那么整个强连通分量的边可以变为2的n次方种(n是某个强连通分量中点的个数),若是形成环路(即强连通分量),只能是正序A1 ->A2 ->A3 ....Ak-1 -> Ak->A1或者是逆序A1->Ak -> Ak-1->....A2->A1两种情况,这两种被认为是混乱的,所以可以改变成不混乱的情况有pow(2,n) - 2种,那么最终的答案就是所有强连通分量不混乱的情况的方案数相乘了,求解过程中根据题意求余即可。
AC代码:
#include<iostream>
#include<vector>
#include<cmath>
#include<stack>
#include<algorithm>
using namespace std;
struct node{
vector<int> vex;
};
node g[200008];
int dfn[200008];
int low[200008];
int visit[200008];
stack<int> stk;
int ans = 0;
int tot;
int cnt;
vector<int> sum;
void tarjan(int x){
dfn[x] = low[x] = ++tot;
visit[x] = 1;
stk.push(x);
for(int i = 0;i<g[x].vex.size();i++){
if(!dfn[g[x].vex[i]]){
tarjan(g[x].vex[i]);
low[x] = min(low[x],low[g[x].vex[i]]);
}
else if(visit[g[x].vex[i]]){
low[x] = min(low[x],dfn[g[x].vex[i]]);
}
}
if(low[x] == dfn[x]){
int temp = 0;//记录每个连通分量的节点个数
ans++;
while(x!=stk.top()){
temp++;
visit[stk.top()] = 0;
stk.pop();
}
temp++;
visit[stk.top()] = 0;
stk.pop();
if(temp>1)
cnt+=temp;
sum.push_back(temp); //记录每个连通分量的节点个数
}
}
int main(){
int N;
cin>>N;
for(int i = 1;i<=N;i++){
int Ai;
cin>>Ai;
g[i].vex.push_back(Ai);
}
for(int i = 1;i<=N;i++){//套tarjan模板求强连通分量
if(!dfn[i])
tarjan(i);
}
long long int fac[200008];
int mod = 1000000007;
fac[0] = 1;
for(int i = 1;i<=N;i++){
fac[i] = (fac[i-1]*2)%mod;//打表 2的n次方和mod求余
}
long long int res = fac[N-cnt]%mod;
for(int i = 0;i<ans;i++){
if(sum[i]>1)
res = res * (fac[sum[i]]-2+mod)%mod;
}
cout<<res%mod;
return 0;
}
codeforces 711 D.Directed Roads(tarjan 强连通分量 )的更多相关文章
- Codeforces 711 D. Directed Roads (DFS判环)
题目链接:http://codeforces.com/problemset/problem/711/D 给你一个n个节点n条边的有向图,可以把一条边反向,现在问有多少种方式可以使这个图没有环. 每个连 ...
- Tarjan 强连通分量 及 双联通分量(求割点,割边)
Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1) 有向图的强联通分量 (2) 无向图的双联通分量(求割点,桥) ...
- tarjan 强连通分量
一.强连通分量定义 有向图强连通分量在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly c ...
- tarjan强连通分量模板(pascal)
友好城市 [问题描述]小 w 生活在美丽的 Z 国. Z 国是一个有 n 个城市的大国, 城市之间有 m 条单向公路(连接城市 i. j 的公路只能从 i 连到 j). 城市 i. j 是友好城市当且 ...
- 1051: [HAOI2006]受欢迎的牛 (tarjan强连通分量+缩点)
题目大意:CodeVs2822的简单版本 传送门 $Tarjan$强连通分量+缩点,若连通块的个数等于一则输出n:若缩点后图中出度为0的点个数为1,输出对应连通块内的点数:否则输出0: 代码中注释部分 ...
- Codeforces Round #244 (Div. 2) C. Checkposts (tarjan 强连通分量)
题目:http://codeforces.com/problemset/problem/427/C 题意:给你n座城市,m条有向道路,然后有一个机制,你在某一个城市设置检查点,那么被设置的检查点受保护 ...
- codeforce 427 C. Checkposts(tarjan 强连通分量)
题目链接:http://codeforces.com/contest/427/problem/C 题目大意是有n个junctions,这些junctions之间有m条道路,两两相连,现在在juncti ...
- [poj 2553]The Bottom of a Graph[Tarjan强连通分量]
题意: 求出度为0的强连通分量. 思路: 缩点 具体有两种实现: 1.遍历所有边, 边的两端点不在同一强连通分量的话, 将出发点所在强连通分量出度+1. #include <cstdio> ...
- [poj 1904]King's Quest[Tarjan强连通分量]
题意:(当时没看懂...) N个王子和N个女孩, 每个王子喜欢若干女孩. 给出每个王子喜欢的女孩编号, 再给出一种王子和女孩的完美匹配. 求每个王子分别可以和那些女孩结婚可以满足最终每个王子都能找到一 ...
随机推荐
- Android 基础知识 -- Linux环境搭建
Android 开发工具下载网站:http://www.androiddevtools.cn/ 1 JDK 1.1 下载JDK,解压后放到/usr/lib/jvm/目录 sudo mv jdk1.7. ...
- 51nod1326 遥远的旅途(spfa+dp)
题意: 给出一个无向图,问从1到n是否存在一条长度为L的路径. n,m<=50,1<=路径长度<=10000,L<=10^18 思路: 改变一下思路,我们发现,假设从起点1走到 ...
- Ioc依赖注入:Unity4.0.1 在项目中的应用 (MVC和API)
使用Unity的好处网上有很多,百度一下即可 这里引用了一篇关于面向接口编程的好处的文章作为引申:https://blog.csdn.net/Cyy19970527/article/details/8 ...
- flex布局 居中
display:flex;justify-content: center;检查侧轴是否居中,比如古代竖着写字,检查字是否在每条竹简的中央. display:flex;align-items: cent ...
- unicode 地址
unicode 地址
- AC认证技术
一.认证方式 Dkey认证(数字密钥认证) 1)免认证key,形同usb,插入即通过认证 2)免审计key,也是上网不被记录审计. 单点登录 登录了某点,其他点都能访问:例如登录了支付宝淘宝就不用登录 ...
- PPTP搭建
一.装包 yum -y install pptpd-1.4.0-2.el7.x86_64.rpm //系统光盘不自带,需要自行下载 二.修改配置文件并启动软件 rpm -qc ...
- Unknown CMake command "check_symbol_exists".
- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpyCMake Error at CMakeLists.txt ...
- vue源码的入口(四)
我们之前提到过 Vue.js 构建过程,在 web 应用下,我们来分析 Runtime + Compiler 构建出来的 Vue.js,它的入口是 src/platforms/web/entry-ru ...
- 番外:你真的了解 Oracle 的启动流程吗?
番外系列说明:该系列所有文章都将作为独立篇章进行知识点讲解,是对其他系列博文进行的补充说明,来自于博客园AskScuti. 主题:关于数据库启动流程的三个阶段 内容预览:本篇涉及数据库启动的三个阶段分 ...