POJ 1308 Is It A Tree?(并查集)
Solution
和 HDU 1272 一毛一样。。
代码
#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
//#define int long long
#define lowbit(x) ((x) & (-x))
using namespace std;
typedef pair<int, int> pii;
typedef pair<long, long> pll;
typedef pair<double, int> pdi;
typedef double dd;
typedef long long ll;
const int MAXN = 100010;
const int MAXM = 10010;
const dd eps = 1e-6;
const int inf = 0x3f3f3f3f;
const ll llinf = 0x3f3f3f3f3f3f3f3f;
int fa[MAXN], vis[MAXN];
int fd(int x){
return x == fa[x] ? x : (fa[x] = fd(fa[x]));
}
int main()
{
int cnt = 0;
while(1)
{
bool ok = 1;
for (int i = 1; i <= 100001;i++)
fa[i] = i, vis[i] = 0;
int x, y;
int num = 0, n = 0;
while (cin >> x >> y)
{
if(x == 0 || x == -1)
break;
if(!vis[x])
n++, vis[x] = 1;
if(!vis[y])
n++, vis[y] = 1;
if(fd(x) == fd(y))
ok = 0;
else
fa[fd(x)] = fd(y), num++;
}
if (n == 0)
n = 1;
if (x == -1)
break;
if (ok && num == n - 1)
printf("Case %d is a tree.\n", ++cnt);
else
printf("Case %d is not a tree.\n", ++cnt);
}
}