题目链接:洛谷 受欢迎的牛

基本上算是一道模板题

根据题意,如果有环,意味着这个环里的牛都互相喜欢

我们可以先求出环,然后把每一个环都看作一个点,这样整个图就变成了一个DAG(有向无环图)

看有几个点出度为0,如果大于一个点没有出边,就说明没有最受欢迎的牛,因为必定有一对牛相互不服

如果只有一个,那么该强联通分量的大小就是答案

然后就是代码了,满满的注释QwQ

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<math.h>
#include<cstring>
#include<bitset>
#include<vector>
#include<queue>
#define ls (p<<1)
#define rs (p<<1|1)
#define over(i,s,t) for(register int i = s;i <= t;++i)
#define lver(i,t,s) for(register int i = t;i >= s;--i)
//#define int __int128
#define lowbit(p) p&(-p)
using namespace std;typedef long long ll;
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const int N = 1e5+7;//点数
const int M = 5e5+7;//边数int ver[M],nex[M],head[N],tot;
int dfn[N];//时间戳
int low[N];//追溯值
int ind;//遍历顺序
int ins[N];//表示当前点是否在队列中
int stk[N],top;//模拟的栈和栈顶元素
int cnt_scc;//强连通分量的个数,其实也是编号
vector<int>scc[N];//记录了编号为i的强连通分量中的所有结点
int scc_id[N];//表示x所在的强连通分量的编号
int cntscc[N];//表示该强连通分量的个数
int n,m;void add(int x,int y){ver[++tot] = y;nex[tot] = head[x];head[x] = tot;
}
/*
规定好,手写栈的时候第一个元素是stk[1],
也就是top = 0 ,stk[++top] = x;
那么栈顶元素就是y = stk[top--]
不能乱套,不然会WA的很难看还很难找到bug
*/
void tarjan(int x){dfn[x] = low[x] = ++ind;//初始化stk[++top] = x;//入栈ins[x] = 1;for(int i = head[x];i;i = nex[i]){int y = ver[i];if(!dfn[y]){//如果没有遍历过就往这里边走tarjan(y);low[x] = min(low[x],low[y]);//更新low,因为low[y]已经更新过了}else if(ins[y]){//如果遍历过并且在栈中//为什么一定要在栈中?//因为如果不在栈中说明它已经属于其他强连通分量了//而每一次出栈都会弹出完整的强连通分量,所以这个点肯定不会产生影响low[x] = min(low[x],dfn[y]);}}if(dfn[x] == low[x]){//说明是一个代表点,也就是一整个强连通分量cnt_scc++;int y;do{y = stk[top--],ins[y] = 0;scc_id[y] = cnt_scc;scc[cnt_scc].push_back(y);cntscc[cnt_scc]++;}while(x != y);//若为回来就一直把整个强连通分量中的点都pop并记录好}
}int out[N];
int ans;int main()
{scanf("%d%d",&n,&m);over(i,1,m){int x,y;scanf("%d%d",&x,&y);add(x,y);//有向边}over(i,1,n)//遍历所有的点if(!dfn[i])//若还未遍历到,则为一个新的强连通分量tarjan(i);//搞他(缩点)over(i,1,n){//这时候已经缩完点了,再找有几个出度为0的 “点”for(int j = head[i];j;j = nex[j]){int k = ver[j];if(scc_id[i] != scc_id[k])//若不是同一个强连通分量说明出度++out[scc_id[i]]++;//该强连通分量的出度++}}over(i,1,cnt_scc){if(!out[i]){//有一个出度为0 的既是答案if(!ans)ans = i;else {puts("0");//有两个出度为0则互不连通没有答案return 0;}}}printf("%d\n",cntscc[ans]);return 0;
}

解题报告:luogu P2341 受欢迎的牛(Tarjan算法,强连通分量判定,缩点,模板)相关推荐

  1. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...

  2. 【洛谷】P2341 受欢迎的牛

    题目地址: https://www.luogu.com.cn/problem/P2341 题目描述: 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶牛都是自恋狂,每头奶牛 ...

  3. 洛谷 P2341 - 受欢迎的牛

    题目描述 P2341 [USACO03FALL][HAOI2006]受欢迎的牛 G 解法: 首先,明确一下什么是明星奶牛:受欢迎的牛只可能是图中唯一的出度为0的强连通分量中的所有奶牛. 为什么? 强连 ...

  4. 洛谷P2341 受欢迎的牛

    题目链接:https://www.luogu.org/problem/show?pid=2341 解题思路: 1.首先可以想到在一个联通块内的牛都可以成为明星奶牛(互相喜欢).这样我们就可以把它们缩成 ...

  5. 【缩点】解题报告:luogu P2746 [USACO5.3]校园网Network of Schools(有向图、强连通分量、缩点)

    题目链接:P2746 [USACO5.3]校园网Network of Schools 用tarjan算法求出强连通分量,并且缩点,如果缩点后只有一个点,则答案为1,0 对于第一问,如果缩点后某一点的入 ...

  6. BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...

  7. bzoj1051 [HAOI2006]受欢迎的牛 tarjan缩点

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢"是可以传递的--如果A喜 欢B,B喜 ...

  8. 【解题报告】openjudge Freda的越野跑 数据结构与算法mooc 内排序

    描述 Freda报名参加了学校的越野跑.越野跑共有N人参加,在一条笔直的道路上进行.这N个人在起点处站成一列,相邻两个人之间保持一定的间距.比赛开始后,这N个人同时沿着道路向相同的方向跑去.换句话说, ...

  9. 【强连通】P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G

    P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G 判断强连通的关键是dfn与low. dfn记录的是节点dfs搜索时的dfs序,而low则是记录表示这个点以及其子孙节点连的 ...

最新文章

  1. Meta发布支持128种语言的新语音模型:指向元宇宙跨语种交流,可在线试玩
  2. 鸿蒙心理测评中心,深度*行业*计算机行业:鸿蒙帆起 国产软硬件风已来
  3. vassist的安装
  4. 15 个必须知道的 Chrome 开发工具技巧
  5. 【NLP】探索NLP模型可解释性的7种姿势
  6. 小余学调度:调度禁忌操作讲解(持续更新中ing)
  7. 再见 Win10系统!下一代操作系统要来了!!
  8. HDU - 4416 Good Article Good sentence(广义后缀自动机/后缀自动机)
  9. LaTeX的编译速度优化方案
  10. 深入理解JavaScript之Event Loop
  11. openstack 功能_为什么我们在OpenStack中冻结功能
  12. python的csv标准库,Python标准库: csv模块——CSV文件的读写
  13. Java-Android【2】-弹出对话框
  14. 什么是restful api
  15. 软件工程设计概念与体系结构设计
  16. Python 基础语法
  17. MFSPV: A Multi-Factor Secured and Lightweight Privacy-Preserving Authentication Schem
  18. Redis持久化中的AOF(Append Only File)持久化
  19. Python3.7.4入门-0/1To Begin/数据类型与结构
  20. 丁林松老师的QT视频及教程源码

热门文章

  1. OpenCV 新版 4.5.1 发布!
  2. 编程——无序数组中找到最大乘积(python)
  3. 链表问题5——反转部分单向链表
  4. excel函数简要使用
  5. Windows 服务器操作系统安全设置加固方法
  6. 阿里云云服务器Centos7部署JDK8+Nginx+Tomcat8+Mysql5.7
  7. 用户家目录下的隐藏文件
  8. 一切成功均源于长期的积累(转)
  9. elasticsearch date格式问题
  10. 已知机器人阿木木_LOL殇之机器人 阿木木皮肤