热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HAOI2006受欢迎的牛:SCC分解与应用

在该问题中,若存在一个节点x满足特定条件,则x所在的强连通分量(SCC)同样满足条件。合法的SCC数量最多为1,因为多个SCC之间具有传递性,理论上应能合并。本文将通过拓扑排序和缩点技术来探讨这一算法的实现。

在分析“受欢迎的牛”问题时,如果存在一个节点x满足给定条件,那么x所在的强连通分量(SCC)同样满足这一条件。此外,合法的SCC数量最多为1,因为如果存在两个或更多满足条件的SCC,它们之间的关系应当是传递的,理论上可以通过合并这些SCC来简化问题。


解决这个问题的一种方法是首先对图进行拓扑排序,然后对排序后的图进行缩点处理。在这个过程中,可能成为答案的SCC必定是最后一个被处理的SCC,这是因为只有这样的SCC没有指向其他任何SCC的边,符合题目中关于“受欢迎”的定义。


#include 
#include
#include
#include
using namespace std;

typedef long long ll;
const int maxn = 1e4 + 6;
int V;
vector G[maxn];
vector rG[maxn];
vector vs; // 后续遍历顺序
bool used[maxn];
int cmp[maxn]; // 所属强连通分量编号

void addEdge(int u, int v) {
G[u].push_back(v);
rG[v].push_back(u);
}

void dfs(int u) {
used[u] = true;
for (int i = 0; i if (!used[G[u][i]]) dfs(G[u][i]);
}
vs.push_back(u);
}

void rDfs(int u, int k) {
used[u] = true;
cmp[u] = k;
for (int i = 0; i if (!used[rG[u][i]]) rDfs(rG[u][i], k);
}
}

int scc() {
fill(used, used + maxn, false);
vs.clear();
for (int i = 1; i <= V; ++i) {
if (!used[i]) dfs(i);
}
fill(used, used + maxn, false);
int k = 0;
for (int i = vs.size() - 1; i >= 0; --i) {
if (!used[vs[i]]) rDfs(vs[i], ++k);
}
return k;
}

int n, m;
int main() {
scanf("%d %d", &n, &m);
V = n;
for (int i = 1; i <= m; ++i) {
int u, v;
scanf("%d %d", &u, &v);
addEdge(u, v);
}
n = scc();

int u = 1, num = 0;
for (int i = 1; i <= V; ++i) {
if (cmp[i] == n) {
u = i;
num++;
}
}

fill(used, used + maxn, false);
rDfs(u, 0);
for (int i = 1; i <= V; ++i) {
if (!used[i]) {
num = 0;
break;
}
}
printf("%d\n", num);
}



以上代码首先实现了添加边的功能,接着通过两次深度优先搜索(DFS)来寻找所有的强连通分量,并对其进行标记。最终,程序检查最后一个被标记的强连通分量是否满足题目要求,并输出符合条件的节点数量。



推荐阅读
  • 题目描述了一个病毒检测问题,要求使用AC自动机算法统计目标文本中多个模式串的出现次数。 ... [详细]
  • 题目概述:给定一棵带颜色节点的树,目标是找到一种方法,通过删除某些边使得每个连通分量内的节点颜色相同。需要计算出所有可能的合法边集的数量。使用动态规划的方法,特别是树形DP来解决问题。 ... [详细]
  • http:acm.hdu.edu.cnshowproblem.php?pid1846好几天没出题了,今天终于水了一题巴什博弈题。总结:【一】巴什博弈对象:一堆石子(可延伸 ... [详细]
  • Spring Boot 入门指南
    本文介绍了Spring Boot的基本概念及其在现代Java应用程序开发中的作用。Spring Boot旨在简化Spring应用的初始设置和开发过程,通过自动配置和约定优于配置的原则,帮助开发者快速构建基于Spring框架的应用。 ... [详细]
  • 本文探讨了在JavaScript中执行字符串形式代码的多种方法,包括使用eval()函数以及跨页面调用的方法。同时,文章详细介绍了JavaScript中字符串的各种常用方法及其应用场景。 ... [详细]
  • 题意题目大意很简单,很容易找出对应字母的ASCII码值的关系,但是有一点需要注意,请看代码:读字符串必须要用getline ... [详细]
  • 本文介绍如何在Ubuntu环境下为OpenWrt系统构建并安装首个'Hello World'应用程序的IPK包。文章不仅涵盖了基本的环境搭建,还详细说明了代码编写、Makefile配置及最终的IPK包生成与安装过程。 ... [详细]
  • 本教程将深入探讨C#编程语言中的条件控制结构,包括if语句和switch语句的使用方法。通过本课的学习,您将掌握如何利用这些控制结构来实现程序的条件分支逻辑。 ... [详细]
  • 本文旨在介绍在iOS平台进行直播技术开发前的准备工作,重点讲解AVFoundation框架的基本概念和使用方法。通过对AVFoundation的深入理解,开发者能够更好地掌握直播应用中的音视频处理技巧。 ... [详细]
  • 按照频率降序打印数字 ... [详细]
  • Gradle复合构建详解
    自Gradle 3.3起,复合构建功能得以实现,这是一种能够整合其他独立构建的高级构建模式。本文将详细介绍复合构建与多项目构建的区别,以及如何在实际项目中应用复合构建。 ... [详细]
  • 本文探讨了如何在无向图中寻找一条从指定起点出发,确保不会连续两次访问同一条边的情况下,获得最大成本路径的方法。 ... [详细]
  • 本文将探讨从ASP.NET 1.1到2.0期间编译系统的重要变革。通过对比两个版本的即时编译模型,我们将揭示2.0版本中引入的新特性和改进之处。 ... [详细]
  • 深入理解设计模式之观察者模式
    本文详细介绍了观察者模式,这是一种行为设计模式,适用于当对象状态发生变化时,需要通知其他相关对象的场景。文中不仅解释了观察者模式的基本概念,还通过Java代码示例展示了其实现方法。 ... [详细]
  • KVO(键值观察)是iOS开发中的一项重要技术,它允许一个对象监视另一个对象的属性变化,并在这些属性发生变化时得到通知。KVO特别适用于需要响应模型数据变化的场景。 ... [详细]
author-avatar
周鑫先生_852
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有