标签:数据结构 并查集
【题目链接】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