UVA10765-Doves and bombs(BCC)

UVA10765-Doves and bombs(BCC)

大家好,又见面了,我是全栈君。

题意:给定一个n个点的连通的无向图。一个点的“鸽子值”定义为将它从图中删去后连通块的个数。

求“鸽子值”按降序排列的前m个。

思路:事实上题目就是要用来寻找割顶,我们仅仅需找出割顶。然后记录这个割顶属于几个不同连通分量的公共点,不是割点的,去掉之后。图的连通块数为1。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

const int MAXN = 10005;

struct node{
    int id, val;
}b[MAXN];

int n, m;
int pre[MAXN], low[MAXN], dfs_clock;
vector<int> g[MAXN];

void init() {
    for (int i = 0; i < n; i++) 
        g[i].clear();
    for (int i = 0; i < n; i++) {
        b[i].id = i; 
        b[i].val = 1;
    }     
}

bool cmp(node a, node b) {
    if (a.val == b.val)
        return a.id < b.id;
    return a.val > b.val;
}

int dfs(int u, int fa) {
    int lowu = pre[u] = ++dfs_clock;
    int child = 0;
    for (int i = 0; i < g[u].size(); i++) {
        int v = g[u][i]; 
        if (!pre[v]) {
            child++;
            int lowv = dfs(v, u);
            lowu = min(lowu, lowv);
            if (lowv >= pre[u]) {
                b[u].val++;
            }
        } 
        else if (pre[v] < pre[u] && v != fa) {
            lowu = min(lowu, pre[v]);
        }
    }
    if (fa < 0 && child == 1) b[u].val = 1;
    low[u] = lowu;
    return lowu;
}

void find_bcc(int n) {
    memset(pre, 0, sizeof(pre));
    memset(low, 0, sizeof(low));
    dfs_clock = 0;
    for (int i = 0; i < n; i++)
        if (!pre[i])
            dfs(i, -1);
}

int main() {
    while (scanf("%d%d", &n, &m)) {
        if (n == 0 && m == 0)
            break;
        init();
        int u, v;
        while (scanf("%d%d", &u, &v)) {
            if (u == -1 && v == -1)
                break;
            g[u].push_back(v);
            g[v].push_back(u); 
        }

        find_bcc(n);
        sort(b, b + n, cmp);
        for (int i = 0; i < m; i++)
            printf("%d %d\n", b[i].id, b[i].val);
        puts("");
    }     
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115689.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月31日 下午11:00
下一篇 2022年1月31日 下午11:00


相关推荐

  • 《博弈论与生活》思维导图高中_生活与消费思维导图

    《博弈论与生活》思维导图高中_生活与消费思维导图前几天看了个综艺《决胜21天》,主要是体现21种博弈论模型的游戏,非常有启发意义。而且博弈论在商业领域、机器学习领域都会有应用,是职场中必须要了解和掌握的一门知识。正好找到了一个有意思的入门点。先入个门,之后再深入系统的学习这个领域。…

    2022年10月15日
    4
  • JavaScript交互式网页设计 • 【第3章 JavaScript浏览器对象模型】

    JavaScript交互式网页设计 • 【第3章 JavaScript浏览器对象模型】全部章节>>>>本章目录3.1浏览器对象模型3.1.1浏览器对象模型3.2window对象3.2.1window对象的常用属性及方法3.2.2使用window对象创建对话框3.2.3使用window对象操作窗口3.2.4使用window对象执行计时事件3.2.5实践练习3.3history对象和location对象3.3.1history对象3.3.2location对象3.3.3实践练习..

    2022年10月20日
    5
  • python中返回上一步操作的代码_Pycharm代码跳转后退回操作详解

    python中返回上一步操作的代码_Pycharm代码跳转后退回操作详解用 Pycharm 写 Python 代码有一段时间了 最近发现了一个 Pycharm 的一个小技巧想分享给大家 下面这篇文章主要给大家介绍了关于 Pycharm 代码跳转该如何回退的相关资料 文中介绍的非常详细 对大家具有一定的参考学习价值 需要的朋友们下面来一起看看吧 背景最近玩 Python 已经有段时间了 一般都是通过 vim 和 Pycharm 来开发 真心觉得这两个是神器 Vim 神器暂且不说 今天来分享 P

    2026年3月27日
    2
  • 详解Seedance 1.0 pro:性能更强、性价比更高

    详解Seedance 1.0 pro:性能更强、性价比更高

    2026年3月13日
    3
  • 进程控制块、进程上下文

    进程控制块、进程上下文一 进程控制块 nbsp nbsp nbsp nbsp nbsp 为了描述和控制进程的运行 系统为每个进程定义了一个数据结构 进程控制块 PCB nbsp 它是进程重要的组成部分 它记录了操作系统所需的 用于描述进程的当前状态和控制进程的全部信息 nbsp 操作系统就是根据进程的 PCB 来感知进程的存在 并依此对进程进行管理和控制 PCB 是进程存在的唯一标识 nbsp nbsp nbsp nbsp nbsp nbsp PCB 主要包括如下 4 方面的信息 nbsp

    2025年12月2日
    6
  • C中枚举(Enum)的介绍以及用法

    C中枚举(Enum)的介绍以及用法enum 枚举的含义 enum 枚举的声明 enum 枚举的特点 enum 枚举的作用 enum 枚举的注意事项

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号