题解 | 连通图

连通图

https://www.nowcoder.com/practice/569e89823a5141fe8a11ab7d4da21edf

#include <iostream>
using namespace std;

const int N = 1010;
int p[N];
int find(int x) {
    if (p[x] != x)p[x] = find(p[x]);
    return p[x];
}
int main() {
    int n, m;
    while (cin >> n >> m) {
        if (n == 0 && m == 0)break;
        //并查集初始化
        for (int i = 1; i <= n; i++)
            p[i] = i;

        int x, y;
        while (m--) {
            cin >> x >> y;
            //合并边
            if (find(x) != find(y))p[find(x)] = find(y);
            }
        
        //合并完后看有几个根结点
        int count = 0;
        int root = 0;
        for (int i = 1; i <= n; i++) {
            if (root != find(i))count++, root = find(i);
        }
        if (count == 1)puts("YES");
        else puts("NO");
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

03-28 19:11
铜陵学院 C++
有礼貌的山羊追赶太阳:太典了,连笔试都没有开始就因为HC满了而结束了,而且还卡你不让你再投其他部门的。
点赞 评论 收藏
分享
找到实习就改名4月17日下午更改:1600一个月?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务