IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> P5058 [ZJOI2004] v-DCC -> 正文阅读

[数据结构与算法]P5058 [ZJOI2004] v-DCC

题意

传送门 P5058 [ZJOI2004]嗅探器

题解

若两个信息中心位于不同的联通分量,则无解;反之,答案为信心中心间编号最小的割点。求点双连通分量,缩点后得到一棵树,用信息中心间的路径上的割点更新答案即可。

n n n 较小时,也可以简单地不通过缩点求解。枚举割点,判断信息中心是否处于不同的连通分量即可。

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int MAXN = 2e5 + 5;
int N, idx[MAXN];
vector<int> G[MAXN], nG[MAXN * 2];
int dep[MAXN * 2], par[MAXN * 2];
int low[MAXN], stk[MAXN], top, rt, dcc_num;
vector<int> dcc[MAXN];
bool cut[MAXN];
set<int> vs;

void dfs(int u, int p, int d)
{
    stk[top++] = u;
    dep[u] = low[u] = d, vs.insert(u);
    int s = 0;
    for (int v : G[u])
    {
        if (dep[v] == -1)
        {
            dfs(v, u, d + 1);
            low[u] = min(low[u], low[v]);
            if (dep[u] <= low[v])
            {
                ++s;
                if (s > 1 || u != rt)
                    cut[u] = 1;
                dcc[dcc_num].clear();
                int w;
                do
                {
                    w = stk[--top];
                    dcc[dcc_num].pb(w);
                } while (w != v);
                dcc[dcc_num].pb(u);
                ++dcc_num;
            }
        }
        else if (v != p)
        {
            low[u] = min(low[u], dep[v]);
        }
    }
}

void ndfs(int u, int p, int d)
{
    par[u] = p, dep[u] = d;
    for (int v : nG[u])
    {
        if (v != p)
            ndfs(v, u, d + 1);
    }
}

void upd(int &res, int u)
{
    if (u < dcc_num)
        return;
    u -= dcc_num;
    if (res == -1 || res > u)
        res = u;
}

int get(int u, int v)
{
    int res = -1;
    if (dep[u] < dep[v])
        swap(u, v);
    while (dep[u] > dep[v])
    {
        u = par[u];
        if (u != v)
            upd(res, u);
    }
    if (u == v)
        return res;
    while (u != v)
    {
        u = par[u], v = par[v];
        upd(res, u), upd(res, v);
    }
    return res;
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> N;
    for (int u, v;;)
    {
        cin >> u >> v;
        if (u == 0 && v == 0)
            break;
        --u, --v;
        G[u].pb(v), G[v].pb(u);
    }
    int s, t;
    cin >> s >> t;
    --s, --t;
    int res = -1;
    memset(dep, -1, sizeof(dep));
    memset(idx, -1, sizeof(idx));
    for (int i = 0; i < N; ++i)
    {
        if (dep[i] != -1)
            continue;
        vs.clear();
        top = 0, rt = i;
        dcc_num = 0;
        dfs(i, -1, 0);
        if (!vs.count(s) || !vs.count(t))
            continue;
        for (int j = 0; j < dcc_num; ++j)
        {
            for (int u : dcc[j])
            {
                if (cut[u])
                    nG[j].pb(dcc_num + u), nG[dcc_num + u].pb(j);
                else
                    idx[u] = j;
            }
        }
        int u = cut[s] ? s + dcc_num : idx[s];
        int v = cut[t] ? t + dcc_num : idx[t];
        ndfs(0, -1, 0);
        res = get(u, v);
        break;
    }
    if (res == -1)
        cout << "No solution\n";
    else
        cout << res + 1 << '\n';
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:22:01  更:2022-03-06 13:26:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:26:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码