YBT高效进阶3.4.2 洛谷P2341 POJ2186受欢迎的牛Popular Cows
发布日期: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; }}

    代码解释

  • 读取输入:读取牛的数量N和边的数量M,然后读取每条边。
  • 构建图和反向图:使用邻接表存储原图和反向图。
  • Kosaraju算法:首先进行一次DFS遍历记录节点的进入时间和离开时间,然后进行第二次DFS遍历,得到SCC。
  • 确定根SCC:检查每个SCC是否有其他SCC指向它,标记为非根SCC。
  • 结果判断:统计根SCC的数量,如果恰好有一个,输出该SCC的大小;否则,输出0。
  • 这种方法通过找到根SCC来确定最终的答案,确保了高效性和准确性。

    上一篇:React学习--组件实例的三大核心属性之state
    下一篇:React学习--定义组件的两种方法

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年03月19日 09时59分15秒