首页 > 其他分享 >题解 CF690C1

题解 CF690C1

时间:2023-02-17 16:24:52浏览次数:49  
标签:ch 并查 CF690C1 题解 复杂度 建图 思路

题目大意:

给定一张 \(n\) 个点 \(m\) 条边的无向图,判断这是不是一棵树。

题目分析:

两种思路:

思路一:

不需要建图,直接使用并查集判环即可

最后判断一下图联不联通就行,具体方法就是看并查集中是不是 \(fa_x = x\) 的情况只存在一个,或者看边数是否等于 \(n-1\)。

时间复杂度 \(O(n + m \log n)\)

思路二:

建图,用 \(dfs\) 判环。

时间复杂度 \(O(n + m)\)

这里给出思路一的代码供大家参考。

代码实现:

#include <bits/stdc++.h>
#define debug(x) cerr<<#x<<": "<<x<<endl;
#define int long long
using namespace std;

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

namespace Larry76{
    const int MAX_SIZE = 1.1e5;
    int fa[MAX_SIZE];
    int getfa(int x){
        if(fa[x]==x)
            return fa[x];
        return fa[x] = getfa(fa[x]);
    }
    void merge(int x,int y){
        int fx = getfa(x);
        int fy = getfa(y);
        fa[fy] = fx;
    }
    void main(){
        //Code Here;
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            fa[i] = i;
        while(m--){
            int u,v;
            cin>>u>>v;
            if(getfa(u)==getfa(v)){
                cout<<"no"<<endl;
                return;
            }
            merge(u,v);
        }
        int same = 0;
        for(int i=1;i<=n;i++)
            if(fa[i] == i)
                same ++;
        if(same>1)
            cout<<"no"<<endl;
        else
            cout<<"yes"<<endl;
    }
}

signed main(){
#ifdef LOCAL
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
    double c1 = clock();
#else
    ios::sync_with_stdio(false);
#endif
//============================================
    Larry76::main();
//============================================
#ifdef LOCAL
    double c2 = clock();
    cerr<<"Used Time: "<<c2-c1<<"ms"<<endl;
    if(c2-c1>1000)
        cerr<<"Warning!! Time Limit Exceeded!!"<<endl;
    fclose(stdin);
    fclose(stdout);
#endif
    return 0;
}

标签:ch,并查,CF690C1,题解,复杂度,建图,思路
From: https://www.cnblogs.com/larry76/p/17130545.html

相关文章

  • 一个autoreconf的报错问题解决
    报错如下configure.ac:36:error:possiblyundefinedmacro:AC_CHECK_LIBIfthistokenandothersarelegitimate,pleaseusem4_pattern_allow.Seet......
  • 题解 CF637B
    题目大意:维护个栈,去重保留最上层题目分析:啥也不是,数组模拟\(\text{stack}+\text{unordered\_map}\)直接秒掉。复杂度\(O(n)\)代码实现:#include<bits/stdc++.h>......
  • 题解 CF742B
    题目大意:给定\(n\)个数,找数对使其异或值为\(k\),求满足这样数对的个数。题目分析:考验位运算功底的题目(实际上也不是很难),主要运用到了下列性质:\[\begin{aligned}\bec......
  • 20230207模拟赛题解
    A-CF755D考虑每次加边产生的贡献。发现每次加边的贡献是这条边与别的边的交点数量加\(1\)。所以可以用线段树或树状数组等数据结构维护,注意要令\(k=\min(k,n-k)\)。B-......
  • CAD坐标显示不全怎么办?CAD坐标常见问题解答!
    今天小编来和大家聊一下浩辰CAD看图王中关于CAD坐标的那些事,比如:CAD坐标为何显示不全?CAD坐标显示结果和之前不一样?以及不能精准捕捉CAD坐标等情况,应该如何轻松解决?今天就和......
  • 0210 模拟题解
    0210模拟题解t1直接枚举\(k\),考虑计算答案。首先发现这个限制等价于存在长度\(\gen-k\)的上升子段。那我们反过来,计算所有上升子段长度都\(\len-k-1\)的方案数......
  • CF、AT 杂题题解
    CF1455Fsolution1前\(i\)次操作只会影响到\([1,i+1]\),并且在第\(i\)次操作前,原本在位置\(i\)的数只可能在\(i\)或\(i-1\)。于是就可以考虑设\(f_{i,0/1}\)......
  • YACS 2023年1月月赛 乙组 T4 加与乘(二) 题解
    题目链接应大家的要求,早上起来更一下乙组T4。这一道题目我们发现不仅会加元素了,还会重复执行任务。很容易想到用两个树状数组来维护每个任务的执行次数,以及每个单元格......
  • ZJOI 2022 部分题解
    ZJOI2022部分题解太菜了所以只写了两题[ZJOI2022]树https://www.luogu.com.cn/problem/P8329题解玩一玩样例可以得到这样的式子\[ans=\sum_{S\cupT=[n],\S\c......
  • 牛客练习赛 108 题解
    六道题目的出题人都是我,希望大家玩的开心!https://ac.nowcoder.com/acm/contest/51208A.惊鸿显然位或之后只会变大,因此答案为\(4\times(a_1\text{or}a_2\text{or}......