CCF 高速公路 tarjan求强连通分量
现在,大臣们帮国王拟了一个修高速公路的计划。看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能。如果城市A可以通过高速公路到达城市B,而且城市B也可以通过高速公路到达城市A,则这两个城市被称为便利城市对。
国王想知道,在大臣们给他的计划中,有多少个便利城市对。
接下来m行,每行两个整数a, b,表示城市a有一条单向的高速公路连向城市b。
1 2
2 3
3 4
4 2
3 5
城市间的连接如图所示。有3个便利城市对,它们分别是(2, 3), (2, 4), (3, 4),请注意(2, 3)和(3, 2)看成同一个便利城市对。
前60%的评测用例满足1 ≤ n ≤ 1000, 1 ≤ m ≤ 10000;
所有评测用例满足1 ≤ n ≤ 10000, 1 ≤ m ≤ 100000。
#include <stdio.h>
#include <string.h>
#include <iostream>
#define maxn 200010
using namespace std; struct Node {
int to;
int nxt;
}edge[maxn]; int head[maxn];
int tot; void addEdge(int u, int v) { // 邻接表形式存储图
edge[tot].to = v;
edge[tot].nxt = head[u];
head[u] = tot++; // head[i] 里存储的是最后一条以i为顶点的边的序号
} int dfn[maxn], low[maxn]; // tarjan 算法的两个数组
int ord, top; // 当前元素是被访问的序号,模拟栈的首部
bool instack[maxn]; // 判断该点是否在栈内
int stac[maxn]; // 栈
int ans; void tarjan(int rt) {
dfn[rt] = low[rt] = ord++; // 初始化该元素的dfn和low数组
instack[rt] = true; // 入栈
stac[++top] = rt; for (int i=head[rt]; i!=-1; i=edge[i].nxt) { // 遍历所有以该点为顶点的边
int v = edge[i].to;
if (!dfn[v]) { // 如果这个点没有被访问过
tarjan(v); // 继续向下搜索
low[rt] = min(low[rt], low[v]); // 更新当前点能回溯到的最远点
}
else if (instack[v] && low[rt] > dfn[v]) { //如果已经被访问过 没有被删除 说明这个点是某个强连通分量的一点 当前根的low值和当前点的dfn值比较并更新
low[rt] = dfn[v]; // 疑问是,这里更新的是low值还是dfn值呢?测试好像谁都可以...
}
} if (low[rt] == dfn[rt]) { // 找到根 取出当前强连通分量
int temp = 0;
int k;
do {
k = stac[top--];
instack[k] = false;
temp++;
}while(k!=rt); if (temp > 1) {
ans += (temp*(temp-1))/2;
}
}
} int main() {
int n, m;
while(cin >> n >> m) {
memset(head, -1, sizeof(head));
memset(dfn, 0, sizeof(dfn));
memset(low, 0, sizeof(low));
memset(instack, 0, sizeof(instack));
ord = 0;
tot = 0;
top = -1;
ans = 0;
for (int i=0; i<m; ++i) {
int u, v;
cin >> u >> v;
addEdge(u, v);
} for (int i=1; i<=n; ++i) { // 依次以所有没被遍历过的点为根尝试搜索强连通分量
if (!dfn[i])
tarjan(i);
} cout << ans << endl;
}
return 0;
}
CCF 高速公路 tarjan求强连通分量的更多相关文章
- UESTC 901 方老师抢银行 --Tarjan求强连通分量
思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...
- tarjan求强连通分量+缩点+割点以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- Tarjan求强连通分量,缩点,割点
Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...
- tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题
Summer Holiday Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】
Road Networks Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Stat ...
- tarjan求强连通分量(模板)
https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...
- Tarjan求强连通分量、求桥和割点模板
Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...
- poj 2186 tarjan求强连通分量
蕾姐讲过的例题..玩了两天后才想起来做 貌似省赛之后确实变得好懒了...再努力两天就可以去北京玩了! 顺便借这个题记录一下求强连通分量的算法 1 只需要一次dfs 依靠stack来实现的tarjan算 ...
随机推荐
- 【angular2+typeScript+ng-zorro】Carousel 走马灯的左右方向控件实现
ng-zorro Carousel 走马灯的左右方向控件实现 ng-zorro框架的走马灯本身还没有左右方向控件的实现,作者只是在文档中(0.6x)中曝出几个方法接口,如图: 实现: 在根compon ...
- Linux内核分析--内核中的数据结构双向链表续【转】
在解释完内核中的链表基本知识以后,下面解释链表的重要接口操作: 1. 声明和初始化 实际上Linux只定义了链表节点,并没有专门定义链表头,那么一个链表结构是如何建立起来的呢?让我们来看看LIST_H ...
- POJ 1704 Georgia and Bob(阶梯博弈)题解
题意:有一个一维棋盘,有格子标号1,2,3,......有n个棋子放在一些格子上,两人博弈,只能将棋子向左移,不能和其他棋子重叠,也不能跨越其他棋子,不能超越边界,不能走的人输 思路:可以用阶梯博弈来 ...
- Farey Sequence (素筛欧拉函数/水)题解
The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/ ...
- 51NOD 1046 A^B Mod C
给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. Input 3个正整数A B C,中间用空格分隔.(1 <= A,B,C <= 10^9) ...
- K条最短路径算法(KSP, k-shortest pathes):Yen's Algorithm
参考: K最短路径算法之Yen's Algorithm Yen's algorithm 基于网络流量的SDN最短路径转发应用 K条最短路径算法:Yen's Algorithm 算法背景 K 最短路径问 ...
- NS3 利用Gnuplot生成拥塞窗口例子fifth.cc的png图像
参考链接:一个ns-3的Gnuplot例子 命令: (1)首先将fifth.cc拷贝到scratch目录下(由于环境变量的因素,./waf编译只对scratch目录下的文件有效,也可以忽略此步,直接. ...
- 如何理解并正确使用MySql索引
原文链接:https://my.oschina.net/feinik/blog/1305784 1.概述 索引是存储引擎用于快速查找记录的一种数据结构,通过合理的使用数据库索引可以大大提高系统的访问性 ...
- yaml 文件保存
with open(mpath, "w") as f: yaml.safe_dump(yaml_dict,f,encoding='utf-8', allow_unicode=Tru ...
- Couldn't find an AF_INET address for
vim ~/.bashrc #输入内容 export ROS_HOSTNAME=你的hostname export ROS_MASTER_URI=http://(目标主机的IP):11311 expo ...