首页 > 其他分享 >受欢迎的牛 G

受欢迎的牛 G

时间:2023-04-02 12:11:37浏览次数:37  
标签:int ++ dfn low 明星 受欢迎 奶牛

受欢迎的牛 G 洛谷

题目描述

每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果 \(A\) 喜欢 \(B\),\(B\) 喜欢 \(C\),那么 \(A\) 也喜欢 \(C\)。牛栏里共有 \(N\) 头奶牛,给定一些奶牛之间的爱慕关系,请你算出有多少头奶牛可以当明星。


输入格式

第一行:两个用空格分开的整数:\(N\) 和 \(M\)。

接下来 \(M\) 行:每行两个用空格分开的整数:\(A\) 和 \(B\),表示 \(A\) 喜欢 \(B\)。

输出格式

一行单独一个整数,表示明星奶牛的数量。


样例输入

3 3
1 2
2 1
2 3

样例输出

1

提示

对于 \(100\%\) 的数据,\(1\le N\le10^4\),\(1\le M\le5\times 10^4\)。


既然题目出现了喜欢这一关系,那么便可以考虑使用图论算法

对于明星奶牛来说,只有其他所有奶牛都喜欢它,才能成为明星奶牛,换句话来说,就是明星奶牛的出度必定为0

如果出现了两个及以上的奶牛出度为0,那么便说明没有奶牛为明星奶牛,而如果明星奶牛也喜欢别的奶牛,那么这只奶牛也是明星奶牛

到这里已经很明显了,我们可以把所有的强连通分量缩点,找到出度为0的点,打印它的数目,便是明星奶牛的数目

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,inx,top,ans;
const int N=10005,M=50005;
struct edge{
	int next,to;
}e[M];
int h[N],dfn[N],low[N],stk[N],vis[N],belong[N],sum[N],out[N];

void add(int x,int y){
	e[++cnt]=(edge){h[x],y};
	h[x]=cnt;
}
void Tarjan(int x){
	dfn[x]=low[x]=++inx;
	stk[++top]=x;vis[x]=1;
	for(int i=h[x];i;i=e[i].next){
		int y=e[i].to;
		if(!dfn[y]){
			Tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(vis[y]){
			low[x]=min(low[x],dfn[y]);
		}
	}
	if(low[x]==dfn[x]){
		ans++;int y=0;
		do{
			y=stk[top--];
			vis[y]=0;
			belong[y]=ans;
			sum[ans]++;//由于需要出度与数目,所有要统计每一个强连通分量的数目以及每个强连通分量的编号
		}while(x!=y);
	}
}
int find(){
	int check=0;
	for(int i=1;i<=ans;i++){
		if(out[i]) continue;
		if(check) return 0;//如果有两个及以上的出度为0的点,那么便没有明星奶牛
		check=sum[i];
	}
	return check;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);
	for(int i=1;i<=n;i++){
		int x=belong[i];
		for(int j=h[i];j;j=e[j].next){
			int y=e[j].to;
			if(belong[y]!=belong[i]) out[x]++;
		}
	}
	printf("%d",find());
	return 0;
}

标签:int,++,dfn,low,明星,受欢迎,奶牛
From: https://www.cnblogs.com/HEIMOFA/p/17280226.html

相关文章

  • 市场上比较受欢迎的ERP模块
    以下是一些在市场上比较受欢迎的ERP模块:供应链管理模块(SCM):随着企业在全球范围内扩展其业务,供应链管理变得越来越复杂。SCM模块提供了从原材料采购到成品交付的端到端可视性和控制,帮助企业优化供应链管理流程。客户关系管理模块(CRM):CRM模块旨在帮助企业管理客户关系,包括营销、......
  • tarjan缩点(受欢迎的牛)
    #include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>usingnamespacestd;intcnt;//计数intnum;//时间戳intp;//栈的......
  • 最受欢迎的大数据可视化
    大数据可视化​是进行各种大数据分析的最重要组成部分之一。一旦原始数据流被以图像形式表示时,以此做决策就变得容易多了。为了满足并超越客户的期望,大数据可视化工具......
  • 22个受欢迎的Python不同类型开源框架
    22个受欢迎的Python不同类型开源框架记录:一、PythonWeb框架Django:PythonWeb应用开发框架链接:https://www.djangoproject.com/Django应该是最出名的Python框架,GAE甚......
  • 微软最受欢迎的前 10 名开源代码库
    微软最受欢迎的前10名开源代码库原创2022-11-2817:52·傻大个黑科技早在2018年,微软就以75亿美元的价格收购了GitHub,在此之前,它就像许多其他科技公司一样,一直是该......
  • 阅读书本《哈佛商学院最受欢迎的领导课》笔记
    领导者应该扪心自问的7种类型的关键型问题①设定愿景与要务②时间管理(利用时间的方式与愿景及优先要务是否相符)③给予反馈,接受反馈④接班规划与工作授权⑤为团队把脉,......
  • #10091. 「一本通 3.5 例 1」受欢迎的牛
    #include<cstdio>#include<iostream>usingnamespacestd;constintN=1E4+10;constintM=5E4+10;structnode{intto,nxt;}e[M];inthead[N......
  • 洛谷P2341/USACO03FALL 受欢迎的牛
    题意分析题目链接喜欢是单向的,喜欢有传递性……Emmm这听起来好像……对了,就是连通性问题!我们不妨将奶牛之间的喜欢关系表示为一条条单向边,怎么求明星奶牛的数量呢?这里......
  • SAS,Stata,HLM,R,SPSS和Mplus分层线性模型HLM分析学生受欢迎程度数据|附代码数据
    全文链接:http://tecdat.cn/?p=10809最近我们被客户要求撰写关于分层线性模型HLM的研究报告,包括一些图形和统计输出。本文用于比较六个不同统计软件程序(SAS,Stata,HLM,R,SPSS......
  • 一款备受欢迎的用户脚本管理器插件TampermonKey-油猴脚本管理器安装与使用
    Tampermonkey简介Tampermonkey是一款备受欢迎的浏览器扩展和用户脚本管理器,它适用于目前各种主流浏览器。方便的脚本管理(正在运行的脚本和可以运行的脚本在图标处显示一......