码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1308 Is It A Tree? && NYOJ 129 (树的判定+并查集)

时间:2015-04-24 10:44:59      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:数据结构 并查集

题目链接click here~~

题目大意】给定多对节点,判断所有节点能否组成一棵树

解题思路】并查集的基本操作,定义node,edge,统计node和edge的数目,如果(edge==node-1||node==0)则可以成树

树的判定:n个节点,最多n-1条环,只有一个入度为边,不成0 的点,其他入度不大于1,不过要注意poj数据里如果1 1 0 0也会不符合要求,也就是不能自己指向自己

代码:

/*
Author:HRW
树的判定:
n个节点,最多n-1条边
不成环
只有一个入度为0 的点
其他入度不大于1
*/
//#include <bits/stdc++.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=100005;
int father[N],sum[N],a,b,node,edge,vis[N],flag;
int find(int x){if(x==father[x]) return x; return father[x]=find(father[x]); }
void Union(int a,int b){
    if(!vis[a]) node++,vis[a]=true;
    if(!vis[b]) node++,vis[b]=true;
    int pa=find(a);
    int pb=find(b);
    if(pa!=pb)
    {
        father[pa]=pb;
        edge++;
    }
    else flag=true;
}
void init(){
    node=edge=0;
    flag=false;
    memset(vis,false,sizeof(vis));
    for(int i=1; i<N; i++) father[i]=i;//father数组初始化
}
int main()
{
    int a,b,tot=1;
    init();
    while(scanf("%d%d",&a,&b)&&a!=-1&&b!=-1){
        if(a==0&&b==0){
            printf("Case %d %s\n",tot++,(!flag&&(edge==node-1||node==0))?"is a tree.":"is not a tree.");
            init();
            continue;
        }
        Union(a,b);
    }
    return 0;
}


POJ 1308 Is It A Tree? && NYOJ 129 (树的判定+并查集)

标签:数据结构 并查集

原文地址:http://blog.csdn.net/u013050857/article/details/45241971

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!