洛谷 P2863

[USACO06JAN] The Cow Prom S

题目描述

有一个 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 的强连通分量个数。

样例 #1

样例输入 #1

5 4
2 4
3 5
1 2
4 1

样例输出 #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

#include <bits/stdc++.h>
using namespace std;
#define N 10005
vector<int> G[N];
//vis 只记录当前连通分量的访问情况(即是否可达),used记录全局的 
bool used[N] = {0}, vis[N] ={0};

int indexx = 0,dfn[N] = {0},low[N] = {0},color[N] = {0};
int colornum = 0;
stack<int> s;
void paint()
{
	int now = s.top();
	s.pop();
	color[colornum]++;
	//这里释放点的访问情况(是否在栈中/是否是当前的联通中) 
	//记录一个点是否在栈中是为了正确判断节点之间的可达性,进而确定哪些节点构成了强连通分量。 
	vis[now] = false; 
}
void dfs(int now)
{
	if(vis[now] == true) return ;
	vis[now] = true;
	used[now] = true;
	s.push(now);
	low[now] = dfn[now] = ++indexx;
	for(int i=0;i<G[now].size();i++)
	{
		int child = G[now][i];
		//如果已经记录时间戳但没有访问的节点不会进入栈中 
		if(dfn[child] == 0)
		{
			dfs(child);
			low[now] = min(low[now],low[child]);
		}//没有分配时间戳则说明未被先前的联通量所搜索
		//分配了时间戳也要检测是否可达(在栈中) 
		else if(vis[child])//else分支一定要加,否则一定会进入 
		{
			low[now] = min(low[now],dfn[child]);
		}
	}
	if(low[now] == dfn[now])
	{
		colornum++;
		while(s.top()!=now)
		{
			paint();
		}
		paint();
	}
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		int from,to;
		cin>>from>>to;
		G[from].push_back(to);
		}	
	for(int i = 1;i<=n;i++)
	{
		if(used[i] == false) dfs(i);
	}
	int ans = 0;
	for(int i = 1;i<=colornum;i++)
	{
		if(color[i]>1) ans++;
	}
	cout<<ans;
	return 0;
 } 

相关推荐

  1. P2863

    2024-04-13 09:52:06       40 阅读
  2. P8823

    2024-04-13 09:52:06       54 阅读
  3. p2006题。p2006题。

    2024-04-13 09:52:06       66 阅读
  4. P1540 机器翻译

    2024-04-13 09:52:06       63 阅读
  5. P1331 海战

    2024-04-13 09:52:06       52 阅读
  6. P1042乒乓球

    2024-04-13 09:52:06       53 阅读
  7. P1434滑雪

    2024-04-13 09:52:06       47 阅读
  8. P1234题解

    2024-04-13 09:52:06       35 阅读
  9. P10397题解

    2024-04-13 09:52:06       29 阅读
  10. P10119 题解

    2024-04-13 09:52:06       22 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-13 09:52:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-13 09:52:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-13 09:52:06       82 阅读
  4. Python语言-面向对象

    2024-04-13 09:52:06       91 阅读

热门阅读

  1. 虾基因组学:概念、历史、现状与展望

    2024-04-13 09:52:06       46 阅读
  2. PCB工艺规范及PCB设计安规原则

    2024-04-13 09:52:06       30 阅读
  3. 针对“AI+医疗”的可行方案

    2024-04-13 09:52:06       49 阅读
  4. python抠图程序

    2024-04-13 09:52:06       32 阅读
  5. P8732 [蓝桥杯 2020 国 ABC] 答疑

    2024-04-13 09:52:06       33 阅读
  6. Wi-Fi信号的EVM指标分析

    2024-04-13 09:52:06       37 阅读
  7. 基于FFmpeg进行rtsp推流及拉流

    2024-04-13 09:52:06       154 阅读
  8. 5.118 BCC工具之xfsslower.py解读

    2024-04-13 09:52:06       151 阅读
  9. Docker Entrypoint和CMD同时使用的注意事项

    2024-04-13 09:52:06       37 阅读