每组数据的第一行是两个整数 n 和 m(0<=n<=1000)。n 表示图的顶点数目,m 表示图中边的数目。随后有 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>
struct Point{
int x;
int y;
};
struct Edge{
int from;
int to;
int height;
};
struct Point point[1000];
struct Edge edge[1000*999/2];
int father[1001];
int height[1001];
void inital(int n){
for(int i = 1; i <= n; i++){
father[i] = i;
height[i] = 1;
}
}
int Find(int x){
if(father[x] != x){
father[x] = Find(father[x]);
}
return father[x];
}
void Union(int a, int b){
a = Find(a);
b = Find(b);
if (a != b){
if(height[a] > height[b]){
father[b] = a;
}
else if (height[a] < height[b])
{
father[a] = b;
}
else{
father[a] = b;
height[b]++;
}
}
}
int main(){
int n, m;
int a, b;
int x, y, c = 0;
while(scanf("%d %d", &n,&m) != EOF){
c = 0;
if (n == 0 || m == 0) break;
inital(n);
for(int i = 0; i < m; i++){
scanf("%d %d", &a, &b);
Union(a, b);
}
x = Find(1);
for(int i = 2; i <= n;i++){
y = Find(i);
if (x == y) continue;
else{
c++;
x = y;
}
}
if(c != 0) printf("%s\n","NO");
else printf("%s\n", "YES");
//printf("%d\n", c);
}
return 0;
} #include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define maxn 1010
int G[maxn][maxn];
bool vis[maxn] = {false};
int n, m;
void init()
{
for (int i = 1; i <= n; i++)
{
vis[i] = false;
for (int j = 0; j <= n; j++)
{
G[i][j] = 0;
}
}
}
void dfs(int u)
{
vis[u] = true;
for (int v = 1; v <= n; v++)
{
if (!vis[v] && G[u][v])
dfs(v);
}
}
int main()
{
while (scanf("%d %d", &n, &m) != EOF && n != 0)
{
int a, b;
init();
for (int i = 0; i < m; i++)
{
scanf("%d %d", &a, &b);
G[a][b] = 1;
G[b][a] = 1;
}
int cnt = 0;
for (int u = 1; u <= n; u++)
{
if (!vis[u])
{
dfs(u);
cnt++;
}
}
printf("%s", cnt == 1 ? "YES\n" : "NO\n");
}
return 0;
} //ky175连通图
#include<stdio.h>
#define MAXN 1001
void Init(int s[]){
for(int i=1;i<MAXN;i++)
s[i]=-1;
}
int Find(int s[],int x){
while(s[x]>=0)
x=s[x];
return x;
}
void Union(int s[],int r1,int r2){
if(r1==r2)return;
else{
if(s[r1]<s[r2]){
s[r1]+=s[r2];
s[r2]=r1;
}
else{
s[r2]+=s[r1];
s[r1]=r2;
}
}
}
int main(){
int n,m;
while(scanf("%d %d",&n,&m)!=EOF){
if(n==0 && m==0)
break;
else{
int count=0;
int P[MAXN];
Init(P);
for(int i=0;i<m;i++){
int a,b;
scanf("%d %d",&a,&b);
int root1=Find(P,a);
int root2=Find(P,b);
if(root1!=root2)
Union(P,root1,root2);
}
for(int j=1;j<=n;j++)
if(P[j]<0)
count++;
if(count==1)
printf("YES\n");
else
printf("NO\n");
}
}
}