POJ 1308-Is It A Tree?(並查集)
Is It A Tree?
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 32343 | Accepted: 10974 |
Description
A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties.
There is exactly one node, called the root, to which no directed edges point.
Every node except the root has exactly one edge pointing to it.
There is a unique sequence of directed edges from the root to each node.
For example, consider the illustrations below, in which nodes are represented by circles and edges are represented by lines with arrowheads. The first two of these are trees, but the last is not.
In this problem you will be given several descriptions of collections of nodes connected by directed edges. For each of these you are to determine if the collection satisfies the definition of a tree or not.
There is exactly one node, called the root, to which no directed edges point.
Every node except the root has exactly one edge pointing to it.
There is a unique sequence of directed edges from the root to each node.
For example, consider the illustrations below, in which nodes are represented by circles and edges are represented by lines with arrowheads. The first two of these are trees, but the last is not.
In this problem you will be given several descriptions of collections of nodes connected by directed edges. For each of these you are to determine if the collection satisfies the definition of a tree or not.
Input
The input will consist of a sequence of descriptions (test cases) followed by a pair of negative integers. Each test case will consist of a sequence of edge descriptions followed by a pair of zeroes Each edge description will consist of a pair of integers;
the first integer identifies the node from which the edge begins, and the second integer identifies the node to which the edge is directed. Node numbers will always be greater than zero.
Output
For each test case display the line "Case k is a tree." or the line "Case k is not a tree.", where k corresponds to the test case number (they are sequentially numbered starting with 1).
Sample Input
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Sample Output
Case 1 is a tree. Case 2 is a tree. Case 3 is not a tree.
Source
題目意思:
給出若干組(a,b)表示一條有向邊的起終點,求這些點能否構成一棵樹。
解題思路:
①一棵樹只有一個根結點;
②除了根節點以外的每一個節點都只有一條邊指向它;
③不能出現環。
合併時注意:若b連到a上,則b要是根節點;同一棵樹的兩點不能再次合併。
用並查集對上述操作檢驗,合法操作合併,最後統計出現過的節點中構成的根節點數量。
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <iomanip>
#include <map>
#include <ctime>
#define INF 0x3f3f3f3f
#define MAXN 110
using namespace std;
int fa[MAXN];
bool vis[MAXN];
int fa_find(int p)
{
if(fa[p]==p) return p;
return fa[p]=fa_find(fa[p]);
}
bool join(int p,int q)
{
int p1=fa_find(p);
int q1=fa_find(q);
if(q1!=q) return true;//q不是根節點
if(p1==q1) return true;//p和q已經在同一棵樹
else fa[q1]=p1;//合併兩棵樹
return false;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("G:/cbx/read.txt","r",stdin);
//freopen("G:/cbx/out.txt","w",stdout);
#endif
int n=0,a,b,ca=0,ans=0;
for(int i=0; i<MAXN; ++i) fa[i]=i;
memset(vis,false,sizeof(vis));
while(~scanf("%d%d",&a,&b))
{
if(a==-1&&b==-1) break;
if(a==0&&b==0)
{
int cnt=0;
for(int i=0; i<n; i++)
{
if(fa[i]==i&&vis[i])//在出現過的節點中統計樹根的數量
++cnt;
if(cnt>1) break;
}
if(cnt>1||ans>0)//多棵樹或者出現過不合法的情況
cout<<"Case "<<++ca<<" is not a tree."<<endl;
else cout<<"Case "<<++ca<<" is a tree."<<endl;
ans=0;//初始化
for(int i=0; i<MAXN; ++i) fa[i]=i;
memset(vis,false,sizeof(vis));
continue;
}
n=max(n,a);
n=max(n,b);//記錄最大的序號
vis[a]=vis[b]=true;//標記節點出現過
if(join(a,b)) ++ans;//出現不合法情況
}
return 0;
}
相關文章
- POJ2492(種類並查集)並查集
- 【POJ 1182】食物鏈(並查集)並查集
- 樹(tree) - 題解(帶權並查集)並查集
- POJ1797 Heavy Transportation【並查集+貪心】並查集
- POJ 1703-Find them, Catch them(並查集)並查集
- POJ 2492 A Bug's Life(關係並查集)並查集
- POJ 1733 Parity【擴充套件域並查集】套件並查集
- POJ2253 Frogger【並查集+貪心】並查集
- POJ 2492-A Bug's Life(帶權並查集)並查集
- POJ 2236-Wireless Network(並查集)並查集
- POJ 2524-Ubiquitous Religions(入門並查集)UI並查集
- POJ 1703 Find them, Catch them (關係並查集)並查集
- poj 1182 並查集經典問題並查集
- HDU 5200 Tree (離線並查集)並查集
- POJ-1182-食物鏈(並查集種類)並查集
- POJ 1611-The Suspects(並查集-同一集合)並查集
- 並查集到帶權並查集並查集
- POJ 2492 A bug's life【擴充套件域 | 邊帶權並查集】套件並查集
- POJ 1182(食物鏈-另類做法【拆點】)[Template:並查集]並查集
- 【並查集】【帶偏移的並查集】食物鏈並查集
- POJ 1182 食物鏈【擴充套件域 | 邊帶權並查集】套件並查集
- POJ 2513-Colored Sticks(連線木棍-trie樹+並查集+尤拉通路)並查集
- 並查集(一)並查集的幾種實現並查集
- 並查集(小白)並查集
- 3.1並查集並查集
- POJ 3321 Apple TreeAPP
- 並查集(Union Find)並查集
- 並查集應用並查集
- The Door Problem 並查集並查集
- 並查集練習並查集
- 並查集的使用並查集
- 並查集—應用並查集
- 寫模板, 並查集。並查集
- 並查集跳躍並查集
- 各種並查集並查集
- 並查集(二)並查集的演算法應用案例上並查集演算法
- The Suspects-並查集(4)並查集
- [leetcode] 並查集(Ⅰ)LeetCode並查集