代码改变世界

连通图

2012-03-27 16:52  璋廊  阅读(273)  评论(0编辑  收藏  举报

http://acm.zzuli.edu.cn/showproblem?problem_id=1243

Time Limit:1000MS Memory Limit:65536K
Total Submit:122 Accepted:60

Description

给你一个无向图,还有这个图上顶点与顶点之间的边,你能判断这个图连通吗?也就是能否从任意一个点开始可以直接或者间接访问到图上的任何一个顶点。

Input 

首先输入一个整数t,表示有t组例子。
每组例子包括两部分;
第一部分(占一行): 一个整数n和m 表示图的顶点的个数和边的个数。
第二部分 有m行 ,每行两个整数s和t,表示顶点s和t之间有一条边(顶点的标号为1到n,其中1<=s,t<=n,1<=n<=100)。

Output

对应每组例子,如果此图为联通图,输出yes,否则输出no。每组结果占一行。

Sample Input

 

2
4 4
1 2
1 3
1 4
2 4
4 3
1 2
2 4
1 4

 

Sample Output

 

yes
no

 

Source

liye

此题为简单的连通图问题,比较简单,我是用数组进行模拟是否连通,用下标和值进行连通。if数组的值全为一个值那么是连通,否着就不连通;

 

#include<stdio.h>
int f[101];
int find(int x)//寻找是否被连通;
{
	if(x==f[x])
		return x;
	return f[x]=find(f[x]);
}
void kru(int x,int y)//进行连通;
{
	int fx,fy;
	fx=find(x);
	fy=find(y);
	if(fx==fy)
		return ;
	if(fx>fy)
		f[fx]=fy;
	else f[fy]=fx;
}
int main()
{
	int t,n,m,i;
	scanf("%d",&t);
	while(t--)
	{
		int x,y;
		scanf("%d%d",&n,&m);
		for(i=1;i<=n;i++)
			f[i]=i;
		for(i=0;i<m;i++)
		{
			scanf("%d%d",&x,&y);
			kru(x,y);
		}
		int p=0;
		for(i=1;i<=n;i++)//判断是否全部被连通;
			if(f[i]==i)
				p++;
			if(p>1)
				printf("no\n");
			else printf("yes\n");
	}
	return 0;
}