九度 题目1109:连通图

来源:互联网 发布:刀锋 知乎 编辑:程序博客网 时间:2024/05/02 05:01
题目描述:

    给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。

输入:

    每组数据的第一行是两个整数 n 和 m(0<=n<=1000)。n 表示图的顶点数目,m 表示图中边的数目。如果 n 为 0 表示输入结束。随后有 m 行数据,每行有两个值 x 和 y(0<x, y <=n),表示顶点 x 和 y 相连,顶点的编号从 1 开始计算。输入不保证这些边是否重复。

输出:

    对于每组输入数据,如果所有顶点都是连通的,输出"YES",否则输出"NO"。

样例输入:
4 31 22 33 23 21 22 30 0

样例输出:

NO

YES

并查集解决,思路简单,代码如下:

#include <stdio.h>
#define N 1000
int fin[N];
int visit[N];

int Find(int a){
    if(a == fin[a]){
        return a;
    }
    return Find(fin[a]);
}


void Merge(int a,int b){
    a = Find(a);
    b = Find(b);
    fin[a] = fin[b];
}

int main(){
    int n,m;
    int a,b;
    int count;
    while(scanf("%d",&n) != EOF && n){
        count = 0;
        scanf("%d",&m);
        for(int i = 1; i <= n; i++){
            fin[i] = i;
            visit[i] = 0;
        }
        for(int i = 0; i < m; i++){
            scanf("%d%d",&a,&b);
            Merge(a,b);
        }

        for(int i = 1; i <= n; i++){
            visit[Find(i)] = 1;
        }

        for(int i = 1; i <= n; i++){
            if(visit[i] == 1){
                count++;//统计此图共有几个根节点
            }
        }
        if(count == 1){//只有一个连通域!则此图为一个连通图!
            printf("YES\n");
        }else if(count > 1){
            printf("NO\n");
        }
    }
}

0 0