有向图的连通性(判强连通)

news/2024/9/19 2:16:14/文章来源:https://www.cnblogs.com/didiao233/p/18308648

讲义


 

 

Kosaraju


 

 

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5;int n, m, u1, v1, vis[N], vis2[N], cnt=0;
vector<int> a[N], ra[N]; 
stack<int> st;
void dfs(int u)
{if (vis[u]) return ;vis[u]=1;for (int i=0; i<a[u].size(); i++){int v=a[u][i];dfs(v);} st.push(u);
}
void dfs2(int u)
{if (vis2[u]) return ;vis2[u]=cnt;for (int i=0; i<ra[u].size(); i++){int v=ra[u][i];dfs2(v);}
}
void ko()
{for (int i=1; i<=n; i++) if (!vis[i]) dfs(i);while (!st.empty()){int u=st.top();st.pop();if (vis2[u]) continue;cnt++;dfs2(u);}
}
int main()
{scanf("%d%d", &n, &m);for (int i=1; i<=m; i++){scanf("%d%d", &u1, &v1);a[u1].push_back(v1);ra[v1].push_back(u1);}ko();printf("%d", cnt);return 0;
}

  

和上述步骤一样,具体不多讲了。

 

 

Tarjan


 

 

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5;int n, m, u1, v1, dfn[N], low[N], idx=0, cnt=0, id[N];
stack<int> st;
vector<int> a[N];
void dfs(int u)
{dfn[u]=low[u]=++idx;st.push(u);for (int i=0; i<a[u].size(); i++){int v=a[u][i];if (!dfn[v]){dfs(v);low[u]=min(low[u], low[v]);}else if (!id[v]) low[u]=min(low[u], dfn[v]);} if (low[u]==dfn[u]){cnt++;while (st.top()!=u){id[st.top()]=cnt;st.pop();}id[st.top()]=cnt;st.pop();}
}
int main()
{scanf("%d%d", &n, &m);for (int i=1; i<=m; i++){scanf("%d%d", &u1, &v1);a[u1].push_back(v1);}for (int i=1; i<=n; i++)if (!dfn[i]) dfs(i);printf("%d", cnt);return 0;
}

  

有向图的强连通分量和无向图的点双类似,当然只是类似,判断条件一样,应该可以感性理解一下

其余都差不多了,就是没有特判根节点

 

 

 

以上代码(板子)为第一题代码

第1题     SCC个数 查看测评数据信息

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

输入格式

 

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

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

2≤n≤1e4,2≤m≤5×1e4,1≤a,b≤n。

 

输出格式

 

仅一行,表示强连通分量个数。

 

输入/输出例子1

输入:

5 4

2 4

3 5

1 2

4 1

 

输出:

3

 

样例解释

 

 

 

 

 

第2题     SCC计数 查看测评数据信息

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

输入格式

 

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

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

2≤n≤1e4,2≤m≤5×1e4,1≤a,b≤n。

 

输出格式

 

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

 

输入/输出例子1

输入:

5 4

2 4

3 5

1 2

4 1

 

输出:

1

 

样例解释

 

稍微加个判断条件即可

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5;int n, m, u1, v1, vis[N], vis2[N], cnt=0, cnt2=0, ans=0;
vector<int> a[N], ra[N]; 
stack<int> st;
void dfs(int u)
{if (vis[u]) return ;vis[u]=1;for (int i=0; i<a[u].size(); i++){int v=a[u][i];dfs(v);} st.push(u);
}
void dfs2(int u)
{if (vis2[u]) return ;vis2[u]=cnt;cnt2++;for (int i=0; i<ra[u].size(); i++){int v=ra[u][i];dfs2(v);}
}
void ko()
{for (int i=1; i<=n; i++) if (!vis[i]) dfs(i);while (!st.empty()){int u=st.top();st.pop();if (vis2[u]) continue;cnt2=0, cnt++;dfs2(u);if (cnt2>1) ans++;}
}
int main()
{scanf("%d%d", &n, &m);for (int i=1; i<=m; i++){scanf("%d%d", &u1, &v1);a[u1].push_back(v1);ra[v1].push_back(u1);}ko();printf("%d", ans);return 0;
}

  

个人推荐用taijan算法,ko算法常数过大

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/745694.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS NEXT 学习笔记4--双向绑定$$

HarmonyOS NEXT 学习笔记4--双向绑定$$1.代码: @Entry @Component struct Page_checkbox {@StateisChecked:boolean = truebuild() {Column() {Text(this.isChecked + )Checkbox()// .shape(CheckBoxShape.ROUNDED_SQUARE)// 这里有坑,编译器会报错.select($$this.isChecked)/…

AI时代你一定要知道的Agent概念

这两年,随着人工智能(AI)和计算能力的发展,AI应用的落地速度大大加快。以ChatGPT为代表的AI应用迅速火遍全球,成为打工人的常用工具。紧接着,多模态、AI Agent等各种高大尚的名词也逐渐进入大众视野,吸引了大量关注。那么,到底什么是AI Agent?下文半支烟将带你详细了解…

读写给大家的AI极简史笔记01机器决策

读写给大家的AI极简史笔记01机器决策1. 识别、洞察、行动 1.1. 当你不知道该做什么时,智力就是你需要使用的东西。 1.1.1. [瑞士]让皮亚杰(Jean Piaget),生物学家和发展心理学家 1.2. 对于人类来说很难的事情,对机器来说很简单。 1.2.1. …

Extension Eslint is configured as formatter but it cannot format TypeScript-files.

应该是Eslint报错了。 到OUTPUT面板查看Eslint的输出信息。

SpringMVC-04-结果跳转及数据处理

1、结果跳转 SpringMVC中有两种实现 Handler 的方式:接口实现 和 注解实现, 两种方式对请求结果的处理各有不同。 1.1、接口Handler处理结果 public class ControllerTest implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, H…

SciTech-EECS-电路设计- PCB设计-PCB设计流程 + 元器件封装设计 + PCB设计规则 +PCB布局/布线/覆铜等设计

PCB(印刷电路板)设计, 是以"电路原理图"为根据实现电路设计者所需要的功能。 "PCB设计"主要指"版图设计", 需要考虑:"外部Connections(连接)"的布局, "内部Components(电子元器件)的优化布局, "金属连线" 和 "Via…

全网最适合入门的面向对象编程教程:19 类和对象的 Python 实现-使用 PyCharm 自动生成文件注释和函数注释

本文主要介绍了在使用Python的IDE-PyCharm时,如何在新建文件时自动添加文件注释的方法,同时对PyCharm中生成函数注释的方法进行了简单介绍。全网最适合入门的面向对象编程教程:19 类和对象的 Python 实现-使用 PyCharm 自动生成文件注释和函数注释 摘要: 本文主要介绍了在使…

spring email 发送功能

邮件通知是现代应用中常见的一种通信方式,特别是在需要及时反馈、告警或重要事件通知的场景下。Spring Boot提供了简单而强大的邮件发送功能,本文将通过pring Boot中使用JavaMailSender 接口实现邮件发送。使用场景说明注册验证:在用户注册、商户注册时,通过邮件发送验证码…

T240718(辐角函数连续性)

复变函数辐角函数的连续性[T240718] 证明复变函数 \(\arg z ~(-\pi<\arg z\le \pi)\) 在负实轴上 (包括原点) 不连续, 除此之外在 \(z\) 平面上处处连续. 证:当 \(z=0\) 时, \(\arg z\) 无意义, 自然不连续. 在负实轴上任取一点 \(z_0\), 当 \(z\) 从上半平面趋于 \(z_0\) …

缺陷和缺陷报告

一、缺陷的基本概述1、缺陷的定义 软件未实现产品说明书要求的功能软件出现了产品说明书指明不应该出现的功能软件实现了产品说明书未提到的功能软件未实现产品说明书虽未明确提及在应该实现的目标软件难以理解、不易使用、运行缓慢或者(从测试的角度看)最终用户会认为不好 2…

用Python实现批量扫描域名是否存在指定文件

初学Python练手项目,直接上代码,后续技术进步了可以加上指定字典扫描,现在还不会^_^ 加上并发的话扫描速度会更快,现在也不会~1 import requests2 3 with open(domains.txt,r) as file:4 domains =[line.strip() for line in file]5 for domain in domains:6 try:7…