首页 > 其他分享 >强连通分量随记随忘

强连通分量随记随忘

时间:2024-03-24 21:44:07浏览次数:26  
标签:连通 int timestamp tot vis 随忘 随记 分量

vis用于判断某个点是否在栈中

tot表示强连通分量的数量

belong[x]表示点x所属的强连通分量

all[]与tot变量相关,表示此强连通分量的点的数量

outd[]与tot变量相关,表示此强连通分量的出度

模板代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int n,m,timestamp;
vector<int> vec[N];
int dfn[N],low[N];
stack<int> stk;
bool vis[N];
int tot;
int belong[N];
int all[N];
int outd[N];
void tarjan(int x){
	timestamp++;
	dfn[x]=timestamp;
	low[x]=timestamp;
	stk.push(x);
	vis[x]=true;
	for (int i=0;i<vec[x].size();i++)
	{
		int v=vec[x][i];
		if (!dfn[v])
		{
			tarjan(v);
			low[x]=min(low[x],low[v]);
		}
		else if (vis[v]) low[x]=min(low[x],low[v]);
	}
	if (low[x]==dfn[x])
	{
		tot++;
		while (!stk.empty())
		{
			int t=stk.top();
			stk.pop();
			vis[t]=false;
			belong[t]=tot;
			all[tot]++; 
			if (t==x) break;
		}
	}
}

int main()
{
	int x,y;
	cin>>n>>m;
	for (int i=1;i<=m;i++)
	{
		cin>>x>>y;
		vec[x].push_back(y);
	}
	for (int i=1;i<=n;i++)
		if (!dfn[i]) tarjan(i);
	for (int i=1;i<=n;i++)
	{
		for (int j=0;j<vec[i].size();j++)
		{
			int v=vec[i][j];
			if (belong[i]!=belong[v]) outd[belong[i]]++;
		}
	}
	int cnt=0,loc;
	for (int i=1;i<=tot;i++)
		if (outd[i]==0)
		{
			cnt++;
			loc=i;
		}
	if (cnt==1) cout<<all[loc];
	else cout<<0;
	return 0;
}

标签:连通,int,timestamp,tot,vis,随忘,随记,分量
From: https://www.cnblogs.com/JacoAwA/p/18093137

相关文章

  • 太阳之华 连通块计数
    C-太阳之华_牛客小白月赛89(nowcoder.com)思路:可以发现,最多经过一次操作就能知道结果:全是蓝色:蓝方胜全是红色:红方胜红方经过一次操作:存在一个连通块扩散等于蓝色个数:红方胜否则,红蓝一直重复进行,平局因此,对棋盘进行一次遍历,将所有红色连通块全部找出来并记上标记(类......
  • DFS求解连通块问题
    DFS求解连通块问题#include<bits/stdc++.h>usingnamespacestd;charg[35][65];intvis[35][65],num,res;intdx[]={0,1,0,-1},dy[]={1,0,-1,0};voiddfs(intx,inty){if(x<1||x>30||y<1||y>60||g[x][y]=='0'||vis[x][y])return;vis[x][......
  • 7-5 列出连通集
    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。输入格式:输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个......
  • CF938G-动态连通图最短xor路(线段树分治、并查集、线性基)
    link:https://codeforces.com/contest/938/problem/G[!Description]有一张连通的无向图简单图,三种操作:1、加边\((x,y,d)\)2、删边\((x,y)\)3、询问\(x\toy\)的路径中异或最小的路径(不一定是简单路径)保证每次操作后图是连通的\(1\leqn,m,q\leq2\times10^5\).这......
  • redis查询端口与密码以及连通性测试方法
    目录一.端口查找二.密码查找三.连通性测试前言:redis的配置信息都在redis.conf文件里面,可以通过find/-nameredis.conf 进行查找文件存放位置,然后进入redis.conf文件进行查看一.端口查找1.使用命令 ps-ef|grepredis进行查找,示例6450/6451均为redis......
  • Python学习随记(三):字符串方法
    Python学习随记(三)字符串方法#字符串方法name='翟图南-袁培风-徐万里汪断水谷继之翟少泽俞名万'print(name)#去除空格strip()lstriprstrip首尾或首或尾的空格print(name.strip())#replace替换print(name.replace('翟','宅'))#切分所有的数据默认......
  • C语言随记————简单算法
    1.问题:如何在C语言中实现一个简单的线性查找算法? 答案:线性查找算法可以通过遍历数组的每个元素,逐一比较来查找目标值。以下是一个简单的实现示例:intlinearSearch(intarr[],intn,intx){for(inti=0;i<n;i++){if(arr[i]==x)re......
  • Python学习随记(二)
    Python学习随记(二)print函数#hello,aworld为print函数所输出测内容,sep='|'中表示使用|替换为输出内容间原本的空格,#end=''使用空格替换print函数结尾原本的换行符print("hello","aworld",sep='|',end='')#检测多行注释是否为字符串print(&......
  • 随记 | 方芳:“基于湖北省随州市广水市村镇地质地貌山路调查”日记(一)
    上世纪,费孝通老师就说到,自古以来就有两个中国,一个是城市中国,一个是农村中国。  100多年过去了,这一基本格局并没有完全改变。高铁、高楼和高速公路带来了城市繁华,与乡村形成强烈反差。高端人士成天生活在日新月异的城市,自我感觉良好,但他们眼中的中国并不完整。  只有当......
  • FREE RTOS学习随记
    最近开始学习实时操作系统提升知识面,刚好STM32的开发板附赠了FREERTOS的学习手册,就据此来学习吧,所谓RTOS,即Real-TimeOpreatingSystem,实时操作系统,这个系统最大的好处就是通过一系列的算法,实现了多任务的灵活切换。单片机本身是单核的,只能单条代码依序执行,所以这个实时也只是伪......