九度OJ 1109:连通图 (最小生成树)

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:2783

解决:1432

题目描述:

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

输入:

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

输出:

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

样例输入:
4 3
1 2
2 3
3 2
3 2
1 2
2 3
0 0
样例输出:
NO
YES
来源:
2011年吉林大学计算机研究生机试真题

思路:

最基本的最小生成树。


代码:

#include <stdio.h>
#include <string.h>
 
#define N 1000
 
int id[N+1];
int n;
int count;
 
void init()
{
    for (int i=1; i<=n; i++)
        id[i] = i;
    count = n;
}
 
void combine(int a, int b)
{
    if (id[a] == id[b])
        return ;
    else
    {
        int tmp = id[b];
        for (int i=1; i<=n; i++)
        {
            if (id[i] == tmp)
                id[i] = id[a];
        }
        count --;
    }
}
 
int main(void)
{
    int m;
    int i;
    int a, b;
 
    while (scanf("%d%d", &n, &m) != EOF && n)
    {
        init();
 
        for (i=0; i<m; i++)
        {
            scanf("%d%d", &a, &b);
            combine(a, b);
        }
 
        if (count == 1)
            printf("YES
");
        else
            printf("NO
");
    }
 
    return 0;
}
/**************************************************************
    Problem: 1109
    User: liangrx06
    Language: C
    Result: Accepted
    Time:30 ms
    Memory:916 kb
****************************************************************/


编程算法爱好者。
原文地址:https://www.cnblogs.com/liangrx06/p/5083923.html