题目来源: http://acm.pku.edu.cn/JudgeOnline/problem?id=1308
解题报告:
首先判断这些点是否属于同一个集合: 如果两个点之间有边相连,则它们属于同一个集合
接着,判断是否存在一个点入度为0,即根
再判断,除了根以外的点,是否入度都为1,
如果满足上述条件,则为树.
int cnt=0;
typedef struct _node
{
int key;
int rank;
int degree;
_node* parent;
}node;
node **s;
node* find(int a)
{
for(int i=0;i<cnt;i++)
if(a==(s[i]->key))
return s[i];
return NULL;
}
void makeSet(int a)
{
if(find(a)==NULL)
{
s[cnt]=new node;
s[cnt]->key=a;
s[cnt]->parent=s[cnt];
s[cnt]->degree=0;
s[cnt]->rank=0;
cnt++;
}
}
node* findSet(node* a)
{
if(a->parent!=a)
a->parent=findSet(a->parent);
return a->parent;
}
void link(node* x, node * y)
{
if(x->rank > y->rank)
y->parent=x;
else
{
x->parent=y;
if(x->rank==y->rank)
y->rank++;
}
}
void _union(int a,int b)
{
node *s=find(b);
s->degree++;
link(findSet(find(a)),findSet(s));
}
int main()
{
int caseNum=0;
int a,b;
s=new node*[10001];
while(1)
{
scanf("%d%d",&a,&b);
if(a==-1 && b==-1)
break;
else if(a==0 && b==0)
{
int n1=0,n2=0,n3=0;
bool judge=true;
for(int i=0;i<cnt;i++)
{
if(s[i]->parent==s[i])
n1++;//集合个数
if(s[i]->degree==0)
n2++;//入度为0的个数
if(s[i]->degree==1)
n3++;//入度为1的个数
}
if(cnt!=0 && (n1!=1 || n2!=1 || n3!=cnt-1))
judge=false;
if(judge)
cout << "Case " << ++caseNum << " is a tree." << endl;
else
cout << "Case " << ++caseNum << " is not a tree." << endl;
cnt=0;
}
else
{
makeSet(a);
makeSet(b);
_union(a,b);
}
}
delete [] s;
return 0;
}
附录:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 9159 | Accepted: 3126 |
Description
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
Output
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.