洛谷P2341 强连通分量

YOLOV5 自动刷图脚本实战(十五)之如何找到正确的门 DXF是一个2D游戏,我们所看到的人物移动,其实是后面的背景在移动,我们所看到的画面,不过是一个完整背景中的一个镜头视角而已想要正确找到门的坐标,我们需要对不同的地图中的每个房间做一些配置信息。 阅读详情

题面

每一个奶牛都喜欢自己,除此以外还有一些喜欢的对象,用边表示。
并且奶牛的喜欢符合传递关系,即A喜欢B,B喜欢C则A喜欢C
被全体奶牛喜欢的奶牛称为明星
给出N头奶牛和M个喜欢关系,求明星数量

1<=N<=10000,1<=M<=50000

分析

如果整个图只是一个强连通分量,那么显然所有点间都可相互到达(喜欢都能传递到),所以图内所有点都是明星。

考虑有多个强连通分量的情况,可以把每个强连通分量先缩点。
F→C
像这种情况,因为有F→C的边,所以分量2中的点都能到达分量1,分量1的出度为0,也就可以做到让分量1内的ABC成为明星

而如果删去F→C的边,分量1和2的出度都为0,就不可能做到某个牛成为明星,因为另一个分量的牛都不喜欢它

经过思考,最终的情况其实就是:当存在大于等于2个分量出度为0时,就不存在明星(如两个出度0的分量中取一个牛,另一个分量中的牛都不喜欢它,不满足所有牛都喜欢)
1个分量出度为0时,其余分量的喜欢可以传递给它,所以这个分量内所有牛都是明星
0个分量出度0,空图。。。就不存在了。

这是求完强连通分量之后的缩点问题,关于求强连通分量,我用的是tarjan的板子。
tarjan法求强连通分量的算法其实和求割点差不多,都用到了pre,low函数,一样的dfs。

标记分量的方法就是找到dfs中第一个进入某个分量的元素,这个元素的特点是low[u]=pre[u],在dfs过程中用一个栈存下还没有分配连通块的元素,一旦遇到了low[u]=pre[u],就连续出栈到u,这一次出栈的元素都属于同一个强连通分量。

代码

#include<iostream>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
vector<int> G[50004];
int dfs_clock = 0, scc_cnt = 0;//时间戳,强连通分量组编号
int sccno[10004];//表示每个点属于哪个强连通块
int pre[10004];//dfs序
int low[10004];//low[u]表示u及其后带通过反向边最多能返回到哪
stack<int> s;//存当前的节点
int out[10004];//出度统计,序号是强连通分量的编号
void dfs(int u)
{
	pre[u] = low[u] = ++dfs_clock;
	s.push(u);
	for (int i = 0; i < G[u].size(); i++)
	{
		int v = G[u][i];//下一个
		if (!pre[v])//未到过v
		{
			dfs(v);
			low[u] = min(low[u], low[v]);
		}
		else if (!sccno[v])//有可能是新的反向边
		{
			low[u] = min(low[u], pre[v]);
		}
	}
	if (low[u] == pre[u])//是第一次发现这个连通分量的点
	{
		scc_cnt++;
		while (true)
		{
			int x = s.top();s.pop();
			sccno[x] = scc_cnt;
			if (x == u)break;
		}
	}
}
void find_scc(int n)
{
	for (int i = 1; i <= n; i++)
	{
		if (!pre[i])dfs(i);
	}
}
int main()
{
	ios::sync_with_stdio(false);
    int n, m,u,v;
    cin >> n >> m;
	for (int i = 0; i < m; i++)
	{
		cin >> u >> v;
		G[u].push_back(v);
	}
	find_scc(n);//开始寻找强连通分量的函数

	//sccno已经处理完,1~scc_cnt
	//开始处理每个块的出度问题
	for (int i = 1; i <= n; i++)
	{
		for (int j = 0;j < G[i].size();j++)//(i,G[i][j])是一条边
		{
			if (sccno[i] != sccno[G[i][j]])out[sccno[i]]++;//不是同一个块,则i的出度++
		}
	}

	int ans = 0;//此时记录out为0的块的个数
	for (int i = 1; i <= scc_cnt; i++)
	{
		if (out[i] == 0)ans++;
	}
	if (ans > 1)cout << 0;//有2个及以上出度0的块,不存在明星
	else {
		ans = 0;
		for (int i = 1; i <= n; i++)
		{
			if (out[sccno[i]] == 0)ans++;//输出出度0的块内所有点
		}
		cout << ans;
	}
    return 0;
}


求强连通分量部分参考了《算法竞赛入门经典-训练指南》的板子

华为OD机试 - TLV格式(Python/JS/C/C++ 2025 C卷 100分) 两端通过TLV格式的报文来通信,现在收到对端的一个TLV格式的消息包,要求生成匹配后的(tag,length,valueOffset)列表。和需要匹配的n个tag对应的n行匹配结果,每一行由长度和偏移量组成。第二行:需要匹配的tag数量n(0 < n < 1000)后面N行:需要匹配n个tag值(十进制表示),递增排列。标签10(0A)存在,长度3,valueOffset=2。标签15(0F)长度4,valueOffset=2。标签14(0E)长度2,valueOffset=8。 阅读详情

相关推荐

STM32平台下FreeModbus TCP协议栈集成指南

深入讲解在STM32平台如何移植和配置freemodbus协议栈,实现TCP通信功能。结合嵌入式开发细节,帮助开发者快速掌握freemodbus的应用与调试技巧。

weixin_36001279的博客 1142

洛谷3916-图的遍历-python-(tarjan强连通分量算法+缩点+图的重建+dfs算法)

题目要求我们求出从每一个点出发所能到达的点的最大值 思路1:对每一个点采用dfs搜索,求出最大点的编号。这样从理论上来说是可行的,但是时间复杂度是O(n^2),肯定是会超时。 思路2:对原图进行缩点,每一个强联通分量都看成一个点,连接这几个点,然后进行dfs,求出每一个点能够到达的最大值作为这一个强连通分量的最大值,最后就是输出答案了。 这里采用思路2来进行解题: ①如何求出一张图的强连通分量 tarjan算法 def tarjan(v): global time,num vis[v]=1

DongLUOWAN的博客 956

[EDA系列]二、Altium Designer异形封装实战:从CAD导入到PCB布局

本文详细介绍了在Altium Designer中实现异形封装的实战流程。通过五步核心操作,将CAD软件中的复杂二维轮廓精准导入并转换为可直接用于PCB布局的智能封装,解决了不规则形状铺铜的难题,特别适用于射频天线、传感器外壳等对机械尺寸有严苛要求的设计场景。

weixin_29194817的博客 142

受欢迎的牛(洛谷-P2341)题解

受欢迎的牛(洛谷-P2341)给定一张有向图,求所有节点都能到达的节点个数。tarjan

m0_67985583的博客 609

CAD的.dwg文件导入 ArcGIS:高程分析、坡度分析、坡向分析

CAD的.dwg文件导入 ArcGIS,再进行高程分析、坡度分析、坡向分析。

My_Echo_yM的博客 7234

从稀疏表示到低秩表示(一)

确定研究方向后一直在狂补理论,最近看了一些文章,有了些想法,顺便也总结了representation系列的文章,由于我刚接触,可能会有些不足,愿大家共同指正。 从稀疏表示到低秩表示系列文章包括如下内容: 一、 sparse representation 二、 一、 sparse representation 1  sparsity  一个线性表示解决的问题如下图所示:

彼岸花 3万+

(强连通分量)洛谷P2341【模板】强连通分量 / [HAOI2006]受欢迎的牛

洛谷P2341【模板】强连通分量 / [HAOI2006]受欢迎的牛 思路: 如题目描述,模板题。 花了两个小时看了tarjan,然后看了题目。what?excuse me?为啥跟我看到的东西感觉不太一样?然后看了大佬的题解,what?为啥叫容易看出,为啥我看不出? 啥叫强连通分量呢,简而言之,一个图的子图中任意两点可以相互到达。(就是构成了一个环)。 下面说tarjan算法。 其中两个重要的数组...

Z7784562的博客 917

schrodinger 薛定谔

链接: https://pan.baidu.com/s/1Duh4GsoytIklvZp7TdHpWg 密码: wmr1 Linux系统版 进入 Schrodinger_Suites_2021-2_Linux-x86_64 sudo ./INSTALL 中间按默认的来即可,也可以自己调整安装目录。安装目录一定要记住。 安装完,把patcher 拷贝到安装目录 sudo ./patcher 点击Patch即可。 启动程序,进入安装目录 ./maestro ...

周迪新的博客 1万+

洛谷P2341(Tarjan+缩点)

解题报告:对于Tarjan的之前的理解的更正: 关于low数组在同一个联通分量中并不是所有的点都是标记为该搜索树的dfn!所以用book数组充当染色的角色。 关于该题的大意就是如果存在两个或以上的明星牛(不在同一个联通分支中)就等于没有!并且如果某几头牛相互关注,相当于形成一个强连通分量,然后该联通分量的出度为0,并且只有一个这样的联通分量的话,这个联通分量的所有牛都是明星! Code: #i...

小胡同的诗 569

组态王与SqlServer数据库交互总结

组态王可以与SqlServer、mysql、acess、oracle等数据库进行数据交互。 本文重点梳理了如何把组态王中的数据保存到SqlServer数据库中,并使用ADO控件对数据库中的数据进行查询。 一、数据存到SQL数据库 1.新建记录体 2、创建表格模板(用于创建数据库中的表格) 3、打开sqlserver,新建数据库 4、创建ODBC数据源 选择自己新建的数据库 5.使用SQLConnect函数连接数据库,SQLCraetTable函数用于在数据库中创建表格 6.使用

逍遥子的博客 2万+

A算法的蒙特卡洛树搜索

A*算法的蒙特卡洛树搜索 作者:禅与计算机程序设计艺术 1. 背景介绍 在人工智能和游戏开发领域,搜索算法是一个非常重要的研究方向。其中A算法和蒙特卡洛树搜索是两种广泛应用的经典算法。A算法是一种启发式搜索算法,通过评估各个节点到目标节点的启发式代价来引导搜索方向,在

AI天才研究院 1734

洛谷 P2341 【HAOI2006】受欢迎的牛

题目链接 https://www.luogu.org/problem/P2341 分析 Tarjan缩点,最后DAG中,唯一的出度为 000 的点的大小即为答案。 AC代码 #include <cstdio> #include <algorithm> #include <stack> using namespace std; inline int read(...

Kevin的博客 297

[明道云] -基础教学1- 创建第一个工作表:从 0 到实用

明道云工作表相当于数据库表,是存储业务数据的核心组件。创建工作表主要有两种方式:1)从空白新建,通过添加字段(最多200个)、设置属性、配置表单样式;2)从Excel导入,需选择sheet、配置字段映射。创建后系统自动生成默认视图,支持多种视图形式(看板/日历等)。建议设置合适的标题字段和关联关系,初学者可在一小时内完成基础应用搭建。后续可扩展权限控制、工作流自动化等功能。

每日出拳老爷子的博客 556

洛谷 P2341 【模板】强连通分量 / [HAOI2006]受欢迎的牛

洛谷 P2341 【模板】强连通分量 / [HAOI2006]受欢迎的牛 题解: (1)首先,这道题涉及强连通分量,那么我们可以使用Tarjan算法来求出所有的强连通分量。 (2)求出所有的强连通分量之后,题目要求我们求出有多少只奶牛可以被其他所有的奶牛所喜欢,那么处于一个强连通分量c1中的所有奶牛它们肯定是互相喜欢的,假设c1的出度为0,说明c1只能作为一个终结点,因为c1是不能再传递爱慕的,所...

化身孤岛的鲸o的博客 465

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【题解】洛谷P2341 [HAOI2006]受欢迎的牛(强连通分量)

洛谷P2341:https://www.luogu.org/problemnew/show/P2341 前言 这题看错题目 足足花了将近5小时提交了15次 在一位dalao的提醒下才AC了 记得要看清题意啊! 思路 可以成为明星的牛是图中唯一的出度为0的强连通分量中的所有牛 因为如果有两个或以上的话 他们之间无法互相爱慕 即可把所有互相爱慕的牛用Tarjan缩点 ...

217

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

洛谷P2341(Tarjin-强连通分量)

题目背景 本题测试数据已修复。 题目描述 每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果A喜 欢B,B喜欢C,那么A也喜欢C。牛栏里共有N 头奶牛,给定一些奶牛之间的爱慕关系,请你 算出有多少头奶牛可以当明星。 输入格式  第一行:两个用空格分开的整数:N和M  第二行到第M + 1行:...

qq_44641782的博客 238

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

洛谷P2341 [USACO03NOV][HAOI2006]受欢迎的牛 G 强连通分量

题目链接:https://www.luogu.com.cn/problem/P2341 本题就是要求强连通分量,那么何为强连通分量?言简意赅地说就是在一个有向图中所有点可以互相可达。在一个强连通分量中,所有牛都是互相喜欢的。我们可以用tarjan来求强连通分量,把一个强连通分量的点全部染成一个颜色,如果一个强连通分量的出度为0,这个强连通分量的牛就可能是明星奶牛,但如果有两个强连通分量的出度为0,...

hhhcbw的博客,欢迎各位来访 239

洛谷P2341 受欢迎的牛(tarjan强连通分量模板)

题目链接:洛谷P2341 受欢迎的牛 题意 每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果A喜欢B,B喜欢C,那么A也喜欢C。牛栏里共有N 头奶牛,给定一些奶牛之间的爱慕关系,请你算出有多少头奶牛可以当明星。 思路 由题可得,受欢迎的奶牛只有可能是图中唯一的出度为零的强连...

weixin_30699465的博客 125

洛谷 P2341 受欢迎的牛(强连通分量)

题目链接: https://www.luogu.org/problemnew/show/P2341 题意: 给定一个有向图,如果aaa能到bbb,bbb能到ccc,那么aaa也能到ccc,问存在多少个这样的点,使得从所有点通过有向边都可以到达它,输出个数 分析: 首先考虑强连通量内任意两点可互相可达,那么如果强连通外的所有点都可以到达任意一个强连通内点,那么这个强连通分量的所有点都是属于结果的集合...

梧桐 418

洛谷 P2341 【受欢迎的牛】

题库:洛谷 题号:2341 题目:受欢迎的牛 link:https://www.luogu.org/problemnew/show/P2341 思路:因为奶牛的爱慕关系具有传递性,所以每个环(强连通分量)里的奶牛是互相喜欢的。那么我们可以用到Tarjan算法把每个强连通分量找出,并缩点,把每个强连通分量都缩成一个点(当前缩点里的奶牛都是互相喜欢的)。这样一来,这个图就变成...

weixin_30898109的博客 162

洛谷P2341 受欢迎的牛 Tarjan缩点

题目链接:https://www.luogu.org/problem/P2341 题意:A喜欢B,B喜欢C,那么A就喜欢C,每个人都必定喜欢自己,求问被所有人喜欢的人有多少个 输入格式:n,m分别是人总数和喜欢关系的数目,接下来m行每行两个数字a,b代表a喜欢b 分析:输入格式方面很容易想到可以转化成图论题来做,在图上,A喜欢B就代表A可达B,强连通分量里面所有点是互相可达的,而强...

weixin_30304375的博客 138

洛谷 p2341 受欢迎的牛 (强连通分量)

题目描述 每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果A喜欢B,B喜欢C,那么A也喜欢C。牛栏里共有N 头奶牛,给定一些奶牛之间的爱慕关系,请你算出有多少头奶牛可以当明星。 输入格式 第一行:两个用空格分开的整数:N和M 第二行到第M + 1行:每行两个用空格分开的整数:A和B,表示A喜欢B...

weixin_44184902的博客 268

洛谷P2341 [HAOI2006]受欢迎的牛

洛谷P2341 筱柒Littleseven QQ:3534947775 题目链接 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int n,tot,to[10001],nex[10001],head[110]; int tar_num,top,c...

筱柒LittleSeven 137

洛谷P2341受欢迎的牛(强连通分量模版)

强连通分量可以看作一组点 这组点中任意两个都是可到达的 然后把这一组点抽象成一个点即可 #include<iostream> #include<cstdio> #include<algorithm> #include<string.h> using namespace std; const int maxn = 1e5+100; const ...

qq_41780519的博客 214

受欢迎的牛(洛谷P2341)

受欢迎的牛(洛谷P2341) 题目描述 每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果A喜 欢B,B喜欢C,那么A也喜欢C。牛栏里共有N 头奶牛,给定一些奶牛之间的爱慕关系,请你 算出有多少头奶牛可以当明星。 输入格式  第一行:两个用空格分开的整数:N和M  第二行到第M + 1行:每...

qq_37455374的博客 249

【luogu P2341 [HAOI2006]受欢迎的牛】 题解

题解报告:https://www.luogu.org/problemnew/show/P2341 我们把图中的强连通分量缩点,然后只有出度为0的牛是受欢迎的,这样如果出度为0的牛只有一个,说明受所有牛欢迎。否则出度为0只是受一些牛欢迎。 #include <stack> #include <cstdio> #include <cstring> #inc...

173
上一篇: 洛谷P2393 yyy loves Maths II
下一篇: 洛谷P2921 在农场万圣节Trick or Treat on the Farm
engineoid
博客等级 码龄10年 6粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值