当前位置: 首页 > wzjs >正文

网站建设与维护 技能智能建站模板

网站建设与维护 技能,智能建站模板,wordpress设置中文字体,如何免费创建企业网站题目描述 有一个 n n n 个点, m m m 条边的有向图,请求出这个图点数大于 1 1 1 的强连通分量个数。 输入格式 第一行为两个整数 n n n 和 m m m。 第二行至 m 1 m1 m1 行,每一行有两个整数 a a a 和 b b b,表示有一条…

题目描述

有一个 n n n 个点, m m m 条边的有向图,请求出这个图点数大于 1 1 1 的强连通分量个数。

输入格式

第一行为两个整数 n n n m m m

第二行至 m + 1 m+1 m+1 行,每一行有两个整数 a a a b b b,表示有一条从 a a a b b b 的有向边。

输出格式

仅一行,表示点数大于 1 1 1 的强连通分量个数。

5 4
2 4
3 5
1 2
4 1
1

提示

数据规模与约定

对于全部的测试点,保证 2 ≤ n ≤ 1 0 4 2\le n \le 10^4 2n104 2 ≤ m ≤ 5 × 1 0 4 2\le m\le 5\times 10^4 2m5×104 1 ≤ a , b ≤ n 1 \leq a, b \leq n 1a,bn


基本概念梳理

强连通图

在一个有向图中,任意两个节点之间都能相互到达,那么这个图就是一个强连通图。

强连通分量(Strongly Connected Components, SCC)

强连通图是非常少的,但是在有向图中,如果存在某些节点子集 A A A,任意两个节点可以相互到达,且如果往子集 A A A 中再加入新的节点,那么子集中任意两个节点之间无法相互到达,那么称这些节点为强连通分量。如下图,共有三个强连通分量,红框中的节点 1 , 2 , 3 1,2,3 1,2,3 组成了一个强连通分量,绿框中的节点 4 , 5 4,5 4,5 组成了另一个强连通分量,蓝框中的节点 6 6 6 是一个强连通分量。
在这里插入图片描述

D F S DFS DFS 遍历

之前我们学习 D F S DFS DFS 遍历的时候,有两种常用的遍历方式。

方式 1 1 1:先访问当前节点,再递归相邻节点。(类似求树的深度)

方式 2 2 2:先递归相邻节点,再访问当前节点。(类似求子树大小)

t a r j a n tarjan tarjan 算法思路

对于 t a r j a n tarjan tarjan 算法,我们用的 d f s dfs dfs 遍历 是上面 方式 2 2 2

对于每个节点来说,有两个重要属性,我通常定义为 i d id id t x tx tx,其中 i d id id 表示 首次到达节点的时间戳, t x tx tx 表示从当前节点出发,可以遍历到的 i d id id 最小的节点的值,对于上面的图,我们可以从节点 1 1 1 出发进行一次【方式 2 2 2】 的 d f s dfs dfs 遍历,试试 可以得到每个节点的 i d id id 值和 t x tx tx 值分别是多少?如下:

节点 1 : i d = 1 , t x = 1 1: id = 1, tx = 1 1:id=1,tx=1

节点 2 : i d = 2 , t x = 1 2:id = 2, tx = 1 2:id=2,tx=1

节点 3 : i d = 3 , t x = 1 3:id = 3, tx = 1 3:id=3,tx=1

节点 4 : i d = 4 , t x = 4 4: id = 4, tx = 4 4:id=4,tx=4

节点 5 : i d = 5 , t x = 4 5: id = 5, tx = 4 5:id=5,tx=4

节点 6 : i d = 6 , t x = 6 6: id = 6, tx = 6 6:id=6,tx=6

通过观察可以发现,同一个强连通分量中的节点,它们的 t x tx tx 值是相等的,而且,强连通分量中的起点的 i d id id 一定等于 t x tx tx

在整个 d f s dfs dfs 搜索过程中,我们需要借助 栈 来保存遍历到的元素,到达某个节点后,先从这个节点开始搜,搜索结束后,更新当前节点的 t x tx tx 值,所有邻接点全部搜索完后,判断当前节点是否是当前这个强连通分量的起点(即 i d id id 是否等于 t x tx tx),如果是,从栈空间中取出当前强连通分量的所有节点即可。

比如,找第一个强连通分量,栈结构如下:
在这里插入图片描述

此时,对于节点 1 1 1 来说,在栈中的位置到栈顶,所有元素都是以 节点 1 1 1 为起点的强连通分量中的元素。

其他两个强连通分量类似,在此不画,可以通过代码来理解。

代码

#include "bits/stdc++.h"
using namespace std;
const int N = 2e4+7, M = 5e4+7;
struct Edge{int v, ne;
}es[M];
struct Node{int id, tx;
}f[N];
int n, t=1, m, u, v, idx = 1, h[N], ans;
stack<int> stk;
bool vis[N];  // 记录节点是否在栈中,在栈中标记为true,否则为false
// dfs函数,传入节点编号,开始从当前节点进行 先搜索后访问的 dfs
void dfs(int u) {f[u].id = t;  // 首次到达的时间戳f[u].tx = t++;  // 可以回溯到最小的时间戳,初始的时候就是 t,跟id 一样stk.push(u);   // 当前节点进栈vis[u] = true;  // 所有进栈的元素全部标记for(int e = h[u]; e; e = es[e].ne) {  // 链式前向星遍历节点 u 的所有邻接点int v = es[e].v;  // u 的 邻接点 vif(f[v].id == 0) {   // 节点v 还没有访问过dfs(v);  // 先搜索f[u].tx = min(f[u].tx, f[v].tx);  // 再更新可以回溯到的最小时间戳} else if(vis[v]) {  // 节点v访问过,如果在栈中,那就一定是当前强连通分量中的节点f[u].tx = min(f[u].tx, f[v].tx);  // 更新最小时间戳}}if(f[u].id == f[u].tx) {  // 节点u 是当前强连通分量中的起点,也可以成为当前强连通分量的根节点int cnt = 0; // 本次强连通分量的节点个数,计算的是大于1 的强连通分量的个数while(!stk.empty() && stk.top() != u) {  // 栈顶这些元素都是和 u 一个强连通分量的,而且 u 是这个强连通分量的鼻祖vis[stk.top()] = false;  // 出栈更新visstk.pop();  // 出栈cnt++;  // 强连通分量中节点数+1}vis[stk.top()] = false;  // 本次是 u 节点stk.pop();  // u 出栈cnt++;  // 个数+1if(cnt > 1) ans++;  // 统计点数大于 1 的强连通分量的个数}
}
// 链式前向星建图
void add(int u, int v) {es[idx] = {v, h[u]};h[u] = idx++;return;
}
int main() {cin >> n >> m;while(m--) {cin >> u >> v;add(u, v);   // 有向图}for(int u=1; u<=n; u++) {if(f[u].id == 0) dfs(u);  // 当前节点还没有遍历过,开始从当前节点搜}cout << ans << endl;return 0;
}

文章转载自:

http://n7iAss1T.xqcbz.cn
http://vry3OJDS.xqcbz.cn
http://6G3zI1Os.xqcbz.cn
http://PmcWQQKd.xqcbz.cn
http://gGTbYZN3.xqcbz.cn
http://7IqPSyuq.xqcbz.cn
http://KeYdALaz.xqcbz.cn
http://haLnPMSs.xqcbz.cn
http://IBcltPmw.xqcbz.cn
http://CKUX5TN7.xqcbz.cn
http://chBuFwBS.xqcbz.cn
http://tI5TAsbz.xqcbz.cn
http://fxRWjJSP.xqcbz.cn
http://2WnghBCt.xqcbz.cn
http://Sp3iRbLk.xqcbz.cn
http://3vJvmjrd.xqcbz.cn
http://2CNs5CWb.xqcbz.cn
http://w5rlzZ4s.xqcbz.cn
http://xCGGrrF0.xqcbz.cn
http://7GkSAQTc.xqcbz.cn
http://qiDy7ddE.xqcbz.cn
http://wGwEOEHh.xqcbz.cn
http://bO3Uwytd.xqcbz.cn
http://pntJ0MHl.xqcbz.cn
http://PYpkcfV7.xqcbz.cn
http://ANgTzc7P.xqcbz.cn
http://YM4phCTK.xqcbz.cn
http://ClTPuyax.xqcbz.cn
http://SETZDx77.xqcbz.cn
http://RYOHFulk.xqcbz.cn
http://www.dtcms.com/wzjs/669869.html

相关文章:

  • 学院网站设计说明书曲靖做网站建设的公司
  • 网站重要三要素wordpress 报错
  • 东莞企业怎么做网站建设宁皓 wordpress
  • 哪个网站可以做链接关于大棚建设的网站
  • 华为云网站定制成都企业网站建设
  • 网站伪静态设置大连网站搜索排名提升
  • 做网站能赚钱免费网站推广入口
  • 齿轮机械东莞网站建设技术支持公众号开发者密码怎么获得
  • 网站建设 江苏wordpress 修改footer
  • 摄影网站 源码资讯网站开发
  • 响应式网站切图抖音企业服务平台
  • 南宁建站有哪些公司wordpress不同背景
  • 深圳建设网站公司排名雅茂道网站建设
  • 企术建站cdr做网站怎么导出
  • 西安信息网站建设wordpress 登录很慢
  • 新手做网站的详细步骤上品设计
  • 曲阜住房城乡建设局网站网站开发与管理实验五
  • 微信导航网站怎么做小当网 绵阳网站建设
  • 安徽省经工建设集团网站自己电脑做网站好吗
  • 太原响应式网站建设如何做亚马逊备案的网站
  • 网站备案帐户有什么用wordpress文章下载
  • 开发软件的网站php做网站的支付功能
  • 做网站公司经营范围手机微网站开发的目的和意义
  • 关于建设公司网站的建议24 手表网站
  • 学院路网站建设做网站用框架么
  • 做视频直播网站wordpress用户名是哪个文件
  • 包包网站建设策划书下载京东网上商城
  • 中国营销网站大全秦皇岛海三建设
  • 成都网站设计公司价格网站建设 业务走下坡
  • 怎样提升网站流量360安全网址导航