Acwing 1174.受欢迎的牛(tarjan求有向图强连通分量 + 缩点)

简介: 笔记

Acwing 1174. 受欢迎的牛


题意

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

现在有 N头牛,编号从 1 到 N  ,给你 M 对整数(A,B) ,表示牛 A认为牛B 受欢迎。 这种关系是具有传递性的,如果A 认为 B 受欢迎,B 认为 C 受欢迎,那么牛 A 也认为牛C 受欢迎。 你的任务是求出有多少头牛被除自己之外的所有牛认为是受欢迎的。


思路

先用tarjan算法求出强连通分量并缩点,缩点后构成一个有向无环图(DAG),如果这个有向无环图的终点 – 即出度为 0 的点只有一个,则这个点是被所有牛认为是受欢迎的,输出这个强连通分量的大小即可,否则不存在受所有牛欢迎的牛


代码

const int N = 5e4 + 10, M = 5 * N;
int n, m;
int h[N], e[M], ne[M], idx;
int dfn[N], low[N];
int dout[N];
int scc, timestamp;
bool in_stk[N];
stack<int>stk;
int id[N], siz[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.push(u), in_stk[u] = true;
    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 (in_stk[j]) {
            low[u] = min(low[u], dfn[j]);
        }
    }
    if (dfn[u] == low[u]) {
        int y = 0;
        ++scc;
        do {
            y = stk.top();
            stk.pop();
            in_stk[y] = false;
            id[y] = scc;
            siz[scc]++;
        } while (y != u);
    }
}
void solve() {
    scanf("%d%d", &n, &m);
    memset(h, -1, sizeof h);
    while (m--) {
        int u, v; scanf("%d%d", &u, &v);
        add(u, v);
    }
    for (int i = 1; i <= n; ++i) {
        if (!dfn[i])
            tarjan(i);
    }
    int cnt = 0;
    int res = 0;
    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]]++;
            }
        }
    }
    for (int i = 1; i <= scc; ++i) {
        if (!dout[i])cnt++, res = siz[i];
    }
    if (cnt == 1) cout << res << endl;
    else puts("0");
}
signed main() {
    //int _; cin >> _;
    //while (_--)
    solve();
    return 0;
}


目录
相关文章
|
JavaScript
vue3,使用watch监听props中的数据
【10月更文挑战第3天】
4167 2
Nuxt中服务端请求无法获取LocalStorage和Cookie的解决办法!
Nuxt中服务端请求无法获取LocalStorage和Cookie的解决办法!
|
自然语言处理 API Python
喜大普奔!Django官方文档终于出中文版了
之前对于 Django 的学习我一直推荐看官方文档,但不得不加上一句“如果你英语水平允许的话……”。现在总算是等来好日子了。各位想向网站/服务器开发方向进阶的同学不要错过,这份官方文档的价值绝对超过市面上任何一本 Django 教材。
|
机器学习/深度学习 人工智能 数据安全/隐私保护
《探秘AI与鸿蒙Next:动画过渡效果的优化密码》
在移动应用和图形界面设计中,动画过渡效果对用户体验至关重要。人工智能与鸿蒙Next图形渲染的结合,为优化动画过渡带来了新机遇。AI通过智能补帧、运动趋势预测和自适应调整等技术,确保动画流畅自然;鸿蒙Next则借助硬件加速、高效布局管理和动画引擎优化,提升渲染效率。二者协同工作,基于数据驱动和智能场景理解,共同实现更流畅、逼真的动画体验,推动图形界面设计迈向更高水平。
506 5
|
2月前
|
人工智能 自然语言处理 安全
2026年新手零门槛解锁OpenClaw/Clawdbot部署+WhatsApp接入教程指南
在AI自动化工具全面普及的2026年,OpenClaw(原Clawdbot、Moltbot)凭借“自然语言指令驱动+全场景任务自动执行”的核心优势,成为个人、跨境从业者及轻量团队的必备智能助手——它无需专业编程基础,无需手动配置复杂运行环境,就能轻松实现文件管理、联网搜索、跨境信息同步、批量消息推送等多元化操作,完美适配WhatsApp的高频使用场景。而阿里云推出的OpenClaw一键部署方案,依托云端基础设施的稳定性与自动化部署能力,预置专属优化镜像、整合所有核心依赖,彻底打破了新手的技术门槛,哪怕你完全不懂服务器、不懂代码,跟着步骤15-20分钟就能完成部署,部署后通过简单配置即可快速接入
551 2
数据结构·二叉排序树(创建、插入、删除)
什么是二叉排序树: 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是中的一类。在一般情况下,查询效率比链表结构要高。 PS: 这里就不多说了,相信大家都有资料,这边直接上代码,代码里有详细的介绍,希望能帮助到大家
674 0
数据结构·二叉排序树(创建、插入、删除)
|
安全 前端开发 Serverless
血亏 2 万,一个 OSS 安全漏洞
血亏 2 万,一个 OSS 安全漏洞,心服口服!也许下个踩坑的就是你。。
血亏 2 万,一个 OSS 安全漏洞
|
网络架构
一文带你了解 Next Route 使用
一文带你了解 Next Route 使用
336 1
|
监控 Java API
【揭秘】如何用Flink CEP揪出那些偷偷摸摸连续登录失败的“捣蛋鬼”?——一场数据流中的侦探游戏
【8月更文挑战第26天】Flink 是一款先进的流处理框架,提供复杂事件处理(CEP)功能以识别实时数据流中的特定模式。CEP 在 Flink 中通过 `CEP` API 实现,支持基于模式匹配的事件检测。本文通过监测用户连续三次登录失败的具体案例介绍 Flink CEP 的工作原理与应用方法。首先创建 Flink 环境并定义数据源,接着利用 CEP 定义连续三次失败登录的模式,最后处理匹配结果并输出警报。Flink CEP 能够轻松扩展至更复杂的场景,如异常行为检测和交易欺诈检测等,有效应对多样化的业务需求。
307 0
|
弹性计算 人工智能 Kubernetes
基于云效 AppStack,5 分钟搞定一个 AI 应用的开发和部署
区别于传统的流水线工具,本实验将带你体验云效应用交付平台 AppStack,从应用视角,完成一个 AI 聊天应用的高效交付。
56264 33

热门文章

最新文章

下一篇
开通oss服务