有向图的强连通分量,tarjan算法,1174. 受欢迎的牛

news/2024/12/22 23:42:17/

1174. 受欢迎的牛 - AcWing题库

每一头牛的愿望就是变成一头最受欢迎的牛。

现在有 N 头牛,编号从 1 到 N,给你 M 对整数 (A,B),表示牛 A 认为牛 B 受欢迎。

这种关系是具有传递性的,如果 A 认为 B 受欢迎,B 认为 C 受欢迎,那么牛 A 也认为牛 C 受欢迎。

你的任务是求出有多少头牛被除自己之外的所有牛认为是受欢迎的。

输入格式

第一行两个数 N,M;

接下来 M 行,每行两个数 A,B,意思是 A 认为 B 是受欢迎的(给出的信息有可能重复,即有可能出现多个 A,B)。

输出格式

输出被除自己之外的所有牛认为是受欢迎的牛的数量。

数据范围

1≤N≤104
1≤M≤5×104

输入样例:
3 3
1 2
2 1
2 3
输出样例:
1
样例解释

只有第三头牛被除自己之外的所有牛认为是受欢迎的

解析:

targan算法能将任何一个图变成一个有向无环图


性质:如果有多个出度为零的点,那么一定不存在任何一头牛被所有牛喜欢,因为出度为零的牛没有喜欢的牛

据此,我们呢可以使用 tarjan 算法进行缩点操作,即:将一个强连通分量看作是一个点,如果存在多个强连通分量的出度为零,那么没有牛被所有的牛喜欢,否则,出度为零的强连通分量所含点的数量即是被所有牛喜欢的牛的数量
 

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
using namespace std;
typedef long long LL;
const int N = 1e4 + 5, M = 5e4 + 5;
int n, m;
int h[N], e[M], ne[M], idx;
int dfn[N], low[N], timestamp;
int stk[N], top;
bool instk[N];
int id[N], siz[N], scc_cnt;
int dout[N];void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}void tarjan(int u) {dfn[u] = low[u] = ++timestamp;stk[++top] = u;instk[u] = 1;for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (!dfn[j]) {tarjan(j);low[u] = min(low[u], low[j]);}else if(instk[j]) {low[u] = min(low[u], dfn[j]);}}if (dfn[u] == low[u]) {++scc_cnt;int y ;do {y = stk[top--];instk[y] = 0;siz[scc_cnt]++;id[y] = scc_cnt;} while (y != u);}}int main() {scanf("%d%d", &n, &m);memset(h, -1, sizeof h);for (int i = 1,a,b; i <= m; i++) {scanf("%d%d", &a, &b);add(a, b);}for (int i = 1; i <= n; i++) {if (!dfn[i])tarjan(i);}for (int i = 1; i <= n; i++) {for (int j = h[i]; ~j; j = ne[j]) {int k = e[j];if (id[i] != id[k]) {dout[id[i]]++;}}}int sum = 0;for (int i = 1; i <= scc_cnt; i++) {if (dout[i] == 0) {if (sum ) {sum = 0;break;}sum += siz[i];}}cout << sum << endl;return 0;
}


http://www.ppmy.cn/news/1215265.html

相关文章

gpt4all 下载、使用、模型

Windows、Linux、Mac 安装包、模型下载&#xff1a;https://jihulab.com/xuxiaowei-cloud/xuxiaowei-cloud/-/issues/56Windows 模型默认文件夹&#xff1a;C:\Users\%USERNAME%\AppData\Local\nomic.ai\GPT4All

JDK更换版本不生效问题

JDK版本更换 问题: 当本地电脑拥有多个版本jdk时, 切换jdk版本不生效 解决方案: 1.查看环境变量(高版本的jdk安装时自动注入环境变量) 2.将Path里面的jdk的bin配置上移到最上面 3.查看jdk版本, java -version 启动项目,显示如下使用了jdk17

STM32独立看门狗(IWDG)溢出时间计算

什么是IWDG&#xff1f; 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动&#xff0c;即使主时钟发生故障它也仍然有效。 IWDG最适合应用于那些需要看门狗作为一个在主程序之外&#xff0c;能够完全独立工作&#xff0c;并且对时间精度要求较低的场合。 从上图我们可以看出IWDG的时…

RK3568开发笔记-amixer开机设置音量异常

目录 前言 一、amixer介绍 1. 显示音频设备信息 2. 显示音量信息

JavaEE进阶学习:Spring核心和设计思想

Spring 是什么 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&#xff0c;有着活跃而庞大的社区&#xff0c;这就是它之所以能长久不衰的原因。Spring 支持广泛的应用场景&#xff0c;它可以让 Java 企业级…

神经风格转化

深入到神经风格转换的领域。你就会发现尽管NST在概念上很容易理解&#xff0c;但要生成高质量图像却出奇地困难。为了获得良好的结果&#xff0c;必须正确实施许多复杂的细节和未提及的技巧。在本文中&#xff0c;我们将深入研究神经风格转换的知识&#xff0c;并详细研究这些技…

【C++】类和对象(2)--构造函数

目录 一 概念 二 构造函数特性 三 默认构造函数 一 概念 对于以下Date类&#xff1a; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year << "-" << _month <…

hub.docker访问不了的问题(一步解决)

暂时我也不清楚&#xff0c;但是下面这个网址可以用(可以先用着)Docker Hub Container Image Library | App Containerization (axlinux.top)https://hub.axlinux.top/