
YBT高效进阶3.4.2 洛谷P2341 POJ2186受欢迎的牛Popular Cows
读取输入:读取牛的数量N和边的数量M,然后读取每条边。 构建图和反向图:使用邻接表存储原图和反向图。 Kosaraju算法:首先进行一次DFS遍历记录节点的进入时间和离开时间,然后进行第二次DFS遍历,得到SCC。 确定根SCC:检查每个SCC是否有其他SCC指向它,标记为非根SCC。 结果判断:统计根SCC的数量,如果恰好有一个,输出该SCC的大小;否则,输出0。
发布日期:2021-05-07 09:21:54
浏览次数:20
分类:精选文章
本文共 1948 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要找到被所有牛认为受欢迎的牛的数量。由于流行是传递的,我们可以使用图论中的强连通分量(SCC)来解决这个问题。
方法思路
问题分析:我们需要处理一个有向图,其中每条边表示一个牛认为另一个牛是受欢迎的。由于流行是传递的,我们需要找到能够通过一系列关系到达所有其他节点的节点。
SCC(强连通分量):使用Kosaraju算法找到图中的SCC。每个SCC中的节点可以相互到达。
反向图:构建反向图来帮助确定哪些SCC是根SCC(没有其他SCC指向它们)。
根SCC判断:在反向图中,检查每个SCC是否有其他SCC指向它。如果没有,则该SCC是根SCC。
结果判断:如果恰好有一个根SCC,则该根SCC的大小即为答案;否则,答案为0。
解决代码
#include#include #include using namespace std;int N, M;vector > adj, r_adj;vector scc_id, component_order;stack stk;void dfs1(int u) { if (scc_id[u] != 0) return; scc_id[u] = ++component_count; stk.push(u); for (int v : adj[u]) { if (scc_id[v] == 0) dfs1(v); }}void dfs2(int u) { for (int v : adj[u]) { if (scc_id[v] == 0) dfs2(v); } stk.push(u);}int main() { cin >> N >> M; adj.resize(N + 1); r_adj.resize(N + 1); for (int i = 1; i <= M; ++i) { int a, b; cin >> a >> b; adj[a].push_back(b); r_adj[b].push_back(a); } scc_id.resize(N + 1, 0); component_order.clear(); for (int u = 1; u <= N; ++u) { if (scc_id[u] == 0) dfs1(u); } while (!stk.empty()) { int u = stk.top(); stk.pop(); component_order.push_back(u); } component_count = component_order.size(); for (int u = 1; u <= N; ++u) { scc_id[u] = component_order[u]; } is_root.resize(component_count + 1, true); for (int u = 1; u <= N; ++u) { for (int v : r_adj[u]) { if (scc_id[u] != scc_id[v]) { if (is_root[scc_id[v]]) { is_root[scc_id[v]] = false; } } } } int root_count = 0; for (int i = 1; i <= component_count; ++i) { if (is_root[i]) { root_count++; } } if (root_count == 1) { int size = 0; for (int u = 1; u <= N; ++u) { if (scc_id[u] == component_count) { size++; } } cout << size; } else { cout << 0; }}
代码解释
这种方法通过找到根SCC来确定最终的答案,确保了高效性和准确性。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月19日 09时59分15秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
OSPF路由重分发配置实例
2019-03-04
VS中使用c++函数显示找不到标识符
2019-03-04
排列组合
2019-03-04
Why Software Development Methodologies Suck?
2019-03-04
怎样从0开始搭建一个测试框架_0
2019-03-04
JPEG压缩技术
2019-03-04
Algorithm: K-Means
2019-03-04
Vmware Pro 12 上安装CentOS 7 64位
2019-03-04
《Windows程序设计》读书笔八 计时器
2019-03-04
《Windows程序设计》读书笔十 菜单和其他资源
2019-03-04
开发基于MFC的ActiveX控件的时候的一些消息处理
2019-03-04
一个C/C++ 命令行参数处理的程序
2019-03-04
一个使用Java语言描述的矩阵旋转的例子
2019-03-04
两款用于检测内存泄漏的软件
2019-03-04
王爽 《汇编语言》 读书笔记 三 寄存器(内存访问)
2019-03-04
IDEA/eclipse集成阿里巴巴Java开发规约插件
2019-03-04
IDEA出现问题:修改jsp页面tomcat不生效解决方案
2019-03-04