【简单图论】CF898 div4 H

这篇具有很好参考价值的文章主要介绍了【简单图论】CF898 div4 H。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Problem - H - Codeforces

题意:

【简单图论】CF898 div4 H,图论,图论

思路:

手玩一下样例就能发现简单结论:

v 离它所在的树枝的根的距离 < m 离这个根的距离时是 YES

否则就是NO

实现就很简单,先去树上找环,然后找出这个根,分别给a 和 b BFS一遍,得出两个dis数组,比较一下即可

对于只有的环情况 和 m = v 的情况需要特判

Code:

#include <bits/stdc++.h>

constexpr int N = 2e5 + 10;
constexpr int M = 1e6 + 10;
constexpr int Inf = 1e9;

std::queue<int> q1, q2;
std::vector<int> adj[N];

int n, a, b;
int top = 0;
int u[N], v[N];
int st[N], r[N];
int dis1[N];
int dis2[N];

int find_r(int u, int fa) {
    if (st[u]) return u;
    st[u] = 1;
    for (auto v : adj[u]) {
        if (v == fa) continue;
        int t = find_r(v, u);
        if (t) {
            r[++ top] = u;
            st[u] = 2;
            return t == u ? 0 : t;
        }
    }
    return 0;
}
void bfs1(int u) {
    memset(dis1, 0x3f, sizeof(dis1));
    dis1[u]= 0;
    q1.push(u);
    while(!q1.empty()) {
        int u = q1.front();
        q1.pop();
        for (auto v : adj[u]) {
            if (dis1[v] > dis1[u] + 1) {
                dis1[v] = dis1[u] + 1;
                q1.push(v);
            }
        }
    }
}
void bfs2(int u) {
    memset(dis2, 0x3f, sizeof(dis2));
    dis2[u] = 0;
    q2.push(u);
    while(!q2.empty()) {
        int u = q2.front();
        q2.pop();
        for (auto v : adj[u]) {
            if (dis2[v] > dis2[u] + 1) {
                dis2[v] = dis2[u] + 1;
                q2.push(v);
            }
        }
    }
}
void solve() {
    std::cin >> n >> a >> b;
    top = 0;
    while(!q1.empty()) q1.pop();
    while(!q2.empty()) q2.pop();
    for (int i = 1; i <= n; i ++) {
        st[i] = 0;
        adj[i].clear();
    }
    for (int i = 1; i <= n; i ++) {
        std::cin >> u[i] >> v[i];
        adj[u[i]].push_back(v[i]);
        adj[v[i]].push_back(u[i]);
    }
    if (a == b) {
        std::cout << "NO" << "\n";
        return;
    }
    find_r(1, 0);
    bfs1(b);
    int miu1 = Inf, ansu = 0;
    for (int i = 1; i <= n; i ++) {
        if (st[i] == 2 && miu1 > dis1[i]) {
            miu1 = dis1[i];
            ansu = i;
        }
    }
    if (st[b] == 2) {
        std::cout << "YES" << "\n";
        return;
    }
    bfs2(a);
    int ans1 = dis2[ansu];
    int ans2 = miu1;
    if (ans1 > ans2) std::cout << "YES" << "\n";
    else std::cout << "NO" << "\n";
}
signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int t = 1;
    std::cin >> t;
    while(t --) {
        solve();
    }
    return 0;
}

 文章来源地址https://www.toymoban.com/news/detail-727139.html

到了这里,关于【简单图论】CF898 div4 H的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CF Round 821 (Div. 2)--C. Parity Shuffle Sorting

    You are given an array a with n non-negative integers. You can apply the following operation on it. Choose two indices l and r (1≤lr≤n). If al+ar is odd, do ar:=al. If al+ar is even, do al:=ar. Find any sequence of at most n operations that makes a non-decreasing. It can be proven that it is always possible. Note that you do not have to mi

    2024年02月11日
    浏览(28)
  • 【*1900 图论+枚举思想】CF1328 E

    Problem - E - Codeforces 题意: 思路: 注意到题目的性质:满足条件的路径个数是极少的,因为每个点离路径的距离 =1 先考虑一条链,那么直接就选最深那个点作为端点即可 为什么,因为我们需要遍历所有点的父亲 推广到树,也是要遍历所有点的父亲 为什么要加枚举的tag,因为

    2024年02月14日
    浏览(28)
  • CF Round 479 (Div. 3)--E. Cyclic Components(DFS求无向图中独立环的个数)

    You are given an undirected graph consisting of n vertices and m edges. Your task is to find the number of connected components which are cycles. Here are some definitions of graph theory. An undirected graph consists of two sets: set of nodes (called vertices) and set of edges. Each edge connects a pair of vertices. All edges are bidirectional (i.e. if

    2024年02月09日
    浏览(25)
  • CF1120 D. Power Tree 巧妙的图论转化

    传送门 [前题提要]:无 题目描述: 考虑对一个点的子树的所有 叶子节点 进行增减任意值.不难联想到对一个点的子树的 所有节点 增减任意值的做法.所以考虑使用类似于树链剖分的方式将树上修改化为链上区间修改. 考虑记录一个点的所有叶子节点,并且按照 d f s dfs df s 序将其

    2024年02月10日
    浏览(23)
  • 【图论经典题目讲解】CF715B - Complete The Graph

    D e s c r i p t i o n mathrm{Description} Description 给定一张 n n n 个点, m m m 条边的无向图,点的编号为 0 ∼ n − 1 0sim n-1 0 ∼ n − 1 ,对于每条边权为 0 0 0 的边赋一个不超过 1 0 18 10^{18} 1 0 18 的 正整数 权值,使得 S S S 到 T T T 的最短路长度为 L L L 。 S o l u t i o n mathrm{Solution} Solut

    2024年02月19日
    浏览(31)
  • 【图论经典题目讲解】CF786B - Legacy 一道线段树优化建图的经典题目

    D e s c r i p t i o n mathrm{Description} Description 给定 1 1 1 张 n n n 个点的有向图,初始没有边,接下来有 q q q 次操作,形式如下: 1 u v w 表示从 u u u 向 v v v 连接 1 1 1 条长度为 w w w 的有向边 2 u l r w 表示从 u u u 向 i i i ( i ∈ [ l , r ] iin [l,r] i ∈ [ l , r ] )连接 1 1 1 条长度为 w w w

    2024年02月20日
    浏览(74)
  • AcWing 898. 数字三角形 (每日一题)

    像数组下标 出现 i-1 的,在循环的时候从 i=1 开始。 0x3f3f3f3f : 1061109567 Integer.MAX_VALUE : 2147483647 在选用 Integer.MAX_VALUE 时,很可能会出现 数据溢出 。 所以在用 Integer.MAX_VALUE 时 需要先取 MAX 再加 a[i][j]; 注:做 数字三角形 这题时, 初始化时需要注意一下边界 。 由于我们 状态计

    2024年02月11日
    浏览(30)
  • c++图论免费ppt,简单深度理解图论

    本篇博文想分享一个ppt,是帮助大家简单深度理解c++图论. 作者承诺:分享的东西没有病毒,是资料。 分享的东西一个是ppt,ppt里面是150页的,里面将带领大家简单深度理解c++图论,还有一个就是里面例题的数据,大家可以按照数据与例题自己练练! 分享的东西免费!免费!免

    2024年02月10日
    浏览(27)
  • 实现div元素和文字水平及垂直居中的方法(超简单,适应各种场合)

    实现实现div元素和文字水平及垂直居中的方法如下: div元素水平居中: style=\\\"margin:0 auto\\\" div元素垂直居中: style=\\\"padding: (外层div的高-内层div的高)/2; background-clip:content-box; \\\" div文字水平居中: 外层div中style=\\\"text-align: center; \\\" div文字垂直居中: 内层div中style=\\\"line-height: 外层div的高

    2024年02月13日
    浏览(32)
  • 简单图论的知识

    Floyd算法是一种求解多源最短路问题的算法。 在floyd中,图一般用邻接矩阵存储,边权可正可负,利用动态规划思想,逐步求解出任意两点之间的最短距离。 我们需要准备一个数组d[N][N][N],初始化无穷。 d[k][i][j]表示路径(除去起点和终点)中编号最大的点编号=k的情况下,点

    2024年04月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包