这道题我只在poj上ac了;
主要考虑几个地放
1:空的也是树, 如(0, 0);
2: 要保证连通性,如,1 2, 2 3, 4 5, 0 0这就不符合;
3:因为是有向图,也不能是双向, 也不能是回路;1 1, 0 0 不符合;
1 2, 2 1, 0 0;
4 :1 2, 0 0也是满足的;
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 100005;
int f[maxn], s[maxn], flag;//s[]是记录是否被访问过;
int find_fa(int x)
{
if(x != f[x]) x = find_fa(f[x]);//只查找,不压缩回路;
return x;
}
void set_(int x, int y)
{
x = find_fa(x);
y = find_fa(y);
if(x != y) f[x] = y;//合并 注意是有序的;
else flag = 0;// 说明有回路;
}
int main()
{
int u, v, k = 0;
while(cin >> u >> v)
{
k++;
if(u < 0|| v < 0) break;
if(u == 0 || v == 0)// 第一种情况;
{
cout << "Case " << k << " is a tree." << endl;
continue;
}
flag = 1;
for(int i = 1; i < maxn; i++)
{
f[i] = i;
s[i] = 0;
}
set_(u, v);
s[u] = s[v] = 1;
while(cin >> u >> v)
{
if(u == 0 && v == 0) break;
set_(u, v);
s[u] = s[v] = 1;
}
int temp = 0;
for(int i = 1; i < maxn; i++)
if(s[i] && f[i] == i) temp++;//判断是不是具有连通性;
if(temp > 1) flag = 0;
if(flag) cout << "Case " << k << " is a tree." << endl;
else cout << "Case " << k << " is not a tree." << endl;
}
return 0;
}
hdu1308
最新推荐文章于 2020-10-10 11:18:55 发布