首页 > 其他分享 >ABC 287 C - Path Graph?

ABC 287 C - Path Graph?

时间:2024-04-21 11:23:31浏览次数:32  
标签:std ABC return int siz cin Path leader 287

题目链接:

首先根据条件 $- 对于所有 i=1,2,…,N−1,有一条边连接顶点 v_i $ 和 \(v_{i+1}\)
可以得到,路径图必须有 \(N-1\) 条边。

其次, If integers \(i\) and \(j\) satisfies \(1 \leq i, j \leq N\) and \(|i - j| \geq 2\), then there is no edge that connects vertices \(v_i\) and \(v_j\).

由此可以得到,该无向图中没有环,且是有着 \(N-1\) 条边的连通图。也即这是一条链以后可以直接记住这个结论

使用并查集判断连通,并且图中只有两个度为 \(1\) 的结点,其余结点度都为 \(2\) 即可。

#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 10;
int p[N], d[N];

int find(int x) {
	if (x != p[x]) p[x] = find(p[x]);
	return p[x];
}

int n, m, c1, c2;

int main()
{
	ios::sync_with_stdio(false), cin.tie(nullptr);

	cin >> n >> m;
	for (int i = 1; i <= n; i++) p[i] = i;
	for (int i = 1; i <= m; i++) {
		int u, v;
		cin >> u >> v;
		d[u] += 1, d[v] += 1;
		p[find(u)] = find(v);
	}
	for (int i = 2; i <= n; i++) {
		if (find(i) != find(1)) {
			cout << "No\n";
			return 0;
		}
	}
	for (int i = 1; i <= n; i++) {
		if (d[i] == 1) c1 ++;
		if (d[i] == 2) c2 ++;
	}
	if (c1 == 2 && c2 == n - 2) cout << "Yes";
	else cout << "No";
	return 0;
}

附上 \(\rm jiangly\) 的代码,便于学习:

#include <bits/stdc++.h>

using i64 = long long;

struct DSU {
    std::vector<int> f, siz;
    DSU(int n) : f(n), siz(n, 1) { std::iota(f.begin(), f.end(), 0); }
    int leader(int x) {
        while (x != f[x]) x = f[x] = f[f[x]];
        return x;
    }
    bool same(int x, int y) { return leader(x) == leader(y); }
    bool merge(int x, int y) {
        x = leader(x);
        y = leader(y);
        if (x == y) return false;
        siz[x] += siz[y];
        f[y] = x;
        return true;
    }
    int size(int x) { return siz[leader(x)]; }
};


int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int N, M;
    std::cin >> N >> M;
    
    if (M != N - 1) {
        std::cout << "No\n";
        return 0;
    }
    
    std::vector<int> deg(N);
    DSU dsu(N);
    for (int i = 0; i < M; i++) {
        int u, v;
        std::cin >> u >> v;
        u--, v--;
        deg[u]++, deg[v]++;
        dsu.merge(u, v);
    }
    for (int i = 0; i < N; i++) {
        if (deg[i] > 2) {
            std::cout << "No\n";
            return 0;
        }
        if (!dsu.same(i, 0)) {
            std::cout << "No\n";
            return 0;
        }
    }
    std::cout << "Yes\n";
    
    return 0;
}

标签:std,ABC,return,int,siz,cin,Path,leader,287
From: https://www.cnblogs.com/pangyou3s/p/18148699

相关文章

  • [ABC350] 赛后总结
    [ABC350]赛后总结AK之。A模拟//Problem:A-PastABCs//Contest:AtCoder-AtCoderBeginnerContest350//Author:Moyou//Copyright(c)2024MoyouAllrightsreserved.//Date:2024-04-2020:00:23#include<algorithm>#include<cstring>#incl......
  • ABC 350F
    没有push_down调了15分钟,然后在赛后7分钟过的,中间看到E是期望题就去打舟了,哎,再也不摆了(期望能不能别再出现了)翻转?这我熟,fhq啊!然后大写变小写?简单,再lazytag搞一下就好了。时间复杂度\(O(n\logn)\),带一个大常数,但是绰绰有余。#include<bits/stdc++.h>#definefor1......
  • ABC350题解(E-G)
    E直接搜一下\(N\)的可能到达的值的个数,发现不多(大约\(10^4\)个),直接暴力dp(记忆化搜索)。转移式\(f_i=\max(X\log_{A}N,\dfrac{\sum\limits_{j=1}^6f_{i/j}}{6}+Y)\)。化简得到\(f_i=\max(X\log_{A}N,\dfrac{\left(\sum\limits_{j=2}^6f_{i/j}\right)+6Y}{5})\)。F文艺......
  • ABC 286 C - Rotate and Palindrome
    题目链接:注意到“您可以按任意顺序执行以下两种运算零次或多次”。因此,解决这个问题的一个重要观察点是,你可以假设\(A\)操作执行了几次,然后\(B\)操作执行了几次。你也可以假设\(A\)操作最多被执行\(N\)次(因为执行\(N\)次就会使它处于原始状态)有了这个观察结果,你就......
  • dbt asset-paths 简单说明
    dbt的asset-paths是一个比较有意思的配置,可以用来增强我们的文档信息,比如存放一些图片在资源描述中引用资源生成的文档中可以进行显示,提示文档的信息参考配置dbt_project.ymlasset-paths:["assets"]使用假如assets包含一些描述图片信息models/ap......
  • [题解]ABC209F Deforestation
    ABC209FDeforestation首先我们可以思考\(a_i\)和\(a_{i+1}\)先砍哪棵花费少。可以看出,当\(a[i]<a[i+1]\)时,先砍\(a[i+1]\),反之亦然。所以这个题转化成了:给定\(n-1\)个关系,分别表示\(n\)个值中相邻两个的大小关系,问满足这些关系的序列个数。与AtcoderEducationalDPContest......
  • ABC349F题解
    思想看到LCM想到质因数分解。首先,我们先把\(M\)质因数分解了,根号复杂度刚好1e8级别。然后我们发现一个很显然的性质:如果一个数不是\(M\)的因数那他肯定没用。所以此处我们就把不是因数地踢掉。我们惊奇地发现因为\(M\)的质因数分解最多\(13\)个不同的质数,然后我......
  • [ABC232G] Modulo Shortest Path (优化建图)
    链接:https://www.luogu.com.cn/problem/AT_abc232_g暴力的做法肯定不行,这道题要用到一个比较经典的拆点操作:把一个点拆成内点和外点。在接下来的分析中会慢慢介绍。由于题目每次连的边都是单向边,那要考虑的问题是:比如说现在要从1走到3,怎么走才能与暴力建边等价。先不考虑取模这......
  • 「杂题乱刷」AT_abc230_e
    链接(luogu)链接(at)典题。整除分块。点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来,是不是该考虑换题?*/#include<bits/stdc++.h>usingnamespacestd;#definemapunordered_map#defineforl(i,a,b)for(registerlong......
  • [题解]ABC282E Choose Two and Eat One
    ABC282EChooseTwoandEatOne又一个图论的回顾——Kruskal最小(最大)生成树算法。看到\(n\)的范围只有\(500\),应该没有什么特别的算法。那么我们考虑建一个*\(n\)个顶点的完全图,节点\(x\)到节点\(y\)的边权值就是\(x^y+y^x\)。然后跑一遍最大生成树,得到的和就是最大结果了。如......