P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G(缩点)

news/2025/3/16 20:26:21/文章来源:https://www.cnblogs.com/gxjcnblogs/p/18775571

P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G

题目背景

本题测试数据已修复。

题目描述

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

输入格式

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

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

输出格式

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

输入输出样例 #1

输入 #1

3 3
1 2
2 1
2 3

输出 #1

1

说明/提示

只有 \(3\) 号奶牛可以做明星。

【数据范围】

对于 \(10\%\) 的数据,\(N\le20\)\(M\le50\)

对于 \(30\%\) 的数据,\(N\le10^3\)\(M\le2\times 10^4\)

对于 \(70\%\) 的数据,\(N\le5\times 10^3\)\(M\le5\times 10^4\)

对于 \(100\%\) 的数据,\(1\le N\le10^4\)\(1\le M\le5\times 10^4\)
这道题就像将在处于一强连通分量的点揉成一个点,如果各个连通分量可以首尾相连形成一个长串,那么串上最后一个强连通分量团里奶牛的个数就是答案,答案是统计出度为零的团,我灵机一动改成了出度不为零,但错了,因为有的团出度和入度都不为零,我写博客时又想到如果缩点之后有两个互相独立的团怎么办,但很快我就想通了,如果有两个独立的团,就有两个团的出度为零,因为强连通分量视为没有出度,这时候就会被特判掉,为什么出度为零的点在两个或以上就不行呢,因为如果有两个说明这两个团只能有其他团到达,但从一个团是不可能同时到达这两个团的

#include<iostream>
#include<vector>
#include<stack>
#define int long long 
using namespace std;
const int N=1e5+5;
int n,m,a,b,cnt=0,t=0,ans=0,num=0;
int low[N],dfsn[N],vis[N],scc[N],sz[N],inc[N],outc[N];
vector<int>v[N];
stack<int>s;
void dfs(int x){low[x]=dfsn[x]=++t;vis[x]=1,s.push(x);for(int y:v[x]){if(!dfsn[y]){dfs(y);low[x]=min(low[x],low[y]);}else if(vis[y])low[x]=min(low[x],dfsn[y]);}if(low[x]==dfsn[x]){cnt++;while(s.top()!=x){vis[s.top()]=0;scc[s.top()]=cnt;sz[cnt]++;s.pop();}vis[s.top()]=0;scc[s.top()]=cnt;sz[cnt]++;s.pop();}}
signed main(){cin>>n>>m;while(m--){cin>>a>>b;v[a].push_back(b);}for(int i=1;i<=n;i++)if(!dfsn[i])dfs(i);for(int x=1;x<=n;x++){for(int y:v[x]){if(scc[x]!=scc[y]){inc[scc[y]]++;outc[scc[x]]++;}}}for(int i=1;i<=cnt;i++){if(!outc[i]){ans+=sz[i];num++;}}if(num>1)cout<<0;else cout<<ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899964.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

允许蜘蛛访问,屏蔽访客的php代码

大部分时候我们制作的泛目录需要屏蔽访客,php的优于js识别蜘蛛屏蔽,毕竟一个在服务器内运行后输出,一个在html中调用。 这里分享一段屏蔽游客查查看真实页面的php代码,直接命名为啥php文件,后在想要屏蔽游客的页面中引用(如:include /baidu.php;)就可以了,代码如下:&…

【程设の旅】第二次上机卡题复盘

python上机 其实很快就写完了,第五题有个坑,讲一下 05:奇偶ASCII值判断 描述 任意输入一个字符,判断其ASCII是否是奇数,若是,输出YES,否则,输出NO 例如,字符A的ASCII值是65,则输出YES,若输入字符B(ASCII值是66),则输出NO 输入 输入一个字符 输出 如果其ASCII值为奇数…

第二章课后习题

Tempconvent.py TempStr = input("请输入带有符号的温度值:") if TempStr[-1] in[F,f]: C = (eval(TempStr[0:-1])-32)/1.8 print("转换后的温度是{:.0f}C".format(C)) elif TempStr[-1] in[C,c]: F = 1.8*eval(TempStr[0:-1])+32 print("转换后的温…

30_正则练习题2

正则练习题正则含义1.1 基础正则 ^ 以什么开头,"^yuchao" 表示匹配以yuchao单词开头的行 $ 以什么结尾,"yuchao$",表示匹配以yuchao单词结尾的行 ^$ 组合符号,表示空行。逻辑解释就是以^开始,以$结尾的行 . 匹配任意且只有一个…

docker-compose 安装elasticsearch

安装版本 elasticsearch 8.14.1 拉取镜像 docker pull elasticsearch:8.14.1如需安装kibana 需要拉取对应版本的kibana镜像 docker pull kibana:8.14.1查看镜像是否安装成功 docker images配置docker-compose.yaml version: 3 services:es:# 镜像名称image: elasticsearch:8.14…

求阶乘

关于最少尾数0的个数,只有2的倍数与5的倍数相乘才能得到0,显然2的倍数比5的倍数多的多,现在目标找5的倍数的个数#include<bits/stdc++.h> #define endl "\n" #define int long long #define x first #define y second using namespace std; typedef long lo…

Visual Studio Code-设置展示多行TAB页

Visual Studio Code-设置展示多行TAB页 一、ctrl + shift + p -> 打开工作区设置(Open Workspace Settings 二、输入 ‘workbench.editor.wrapTabs’

Git-git生成SSH密钥

Git-git生成SSH密钥 一、生成 SSH 密钥 如果你还没有生成 SSH 密钥,可以使用以下命令生成新的 SSH 密钥对: 这里 -t rsa 指定密钥类型为 RSA,-b 4096 指定密钥长度为 4096 位,-C 添加一个注释,通常是你的电子邮件地址。 ssh-keygen -t rsa -b 4096 -C "your_email@ex…

鲜花:《一种基于错误的寻找重心方法的点分治的复杂度分析》注

原文:一种基于错误的寻找重心方法的点分治的复杂度分析 LCA 还是太神了,研究半天才看明白。 所以这里提供一种说人话版本。 为什么法一是错的? 原文提出了这样一个 hack:这是三个等长度的共端点的链,初始以红色箭头所指的点为根。 进行第一次分治:红色箭头所指的点是重心…

SpringBoot的WebServlet的兼容

一.使用SpringBean注册JavaWeb的三大组件 在 Spring Boot 中,使用 @Bean 注册的 Servlet、Filter 和 Listener 组件会被加载到 Servlet 容器 中管理,而不是直接由 Spring 容器管理。然而,Spring Boot 提供了一些机制来确保这些组件能够与 Spring 容器无缝集成。Servlet 容器…