您的位置:首页 > 其它

zju 2740 Message System

2008-05-13 21:51 183 查看
题目的意思就是判断一个图是否是树,一开始我的做法是先判断图是否联通,然后判断是否有环.判断联通用了O(N),然后判断环用了O(N^2),tle了.后来在网上搜了下,想起了判断环可以用并查集,并且并查集也可以判断是否是联通的,而且用最简单的并查集就行了

#include<iostream>
#include <string>
#include <set>
using namespace std;
int m, n;
int p[1001], num[1001];
int find(int t)
{
int ot = t;
if(p[t] == t)
return t;
while (p[t] != t)
{
t = p[t];
}
int temp;
while (p[ot] != t)
{
temp = p[ot];
p[ot] = t;
ot = temp;
}
return t;
}
bool unit(int a, int b)
{
int pa = find(a);
int pb = find(b);
if(pa == pb)
return false;
if(num[pa] > num[pb])
{
p[pb] = pa;
++num[pa];
}
else
{
p[pa] = pb;
++num[pb];
}
return true;
}
int main()
{
int i, j;
int a, b;
while (scanf("%d%d",&n,&m) != EOF)
{
if(m==0 && n==0)
break;
if(m != n-1)
{

for (i=0; i<m; ++i)
scanf("%d%d",&a,&b);
printf("No/n");
continue;
}
for (i=1; i<=n; ++i)
{
p[i] = i;
num[i] = 1;
}
bool flag = true;
for (i=0; i<m; ++i)
{
scanf("%d%d",&a,&b);
if(!unit(a,b))
flag = false;
}
if(flag)
printf("Yes/n")    ;
else
printf("No/n");

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: