- 题目描述:
-
给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。
- 输入:
-
每组数据的第一行是两个整数 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
思路:
最基本的最小生成树。
代码:
#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 ****************************************************************/