树的概念是

  • 根的入度为0,其他入度为1
  • 不能形成环
  • 只有1个根

审题不规范,交题两行泪
我特么就少了个句号,wa了好久好久
然后把第一次提交的代码加了句号后,ac了
树_第1张图片

版本1

#include 
#include 
#include 
#include 
#define bug printf("hh\n")
using namespace std;
const int maxn=1e5;
int fa[maxn],Rank[maxn],degree[maxn];
bool flag=true;
int cnt=1;
std::vector vec;
int father(int x){
    if(fa[x]==x)return x;
    return fa[x]=father(fa[x]);
}
void unit(int u,int v){
    int x=father(u);
    int y=father(v);
    if(x==y){flag=false;return;}
    if(Rank[x]=2){//入度问题
            flag=false;
            return;
        }
    }
}
void print(){
    printf("%s.\n",flag==1?"a tree":"not a tree");
}
int main(){
    int u,v;
    init();
    while(~scanf("%d%d",&u,&v)){
        if(u==0&&v==0){//数据输入到了0,表示一组完成,该开始计算且初始化
            printf("Case %d is ",cnt++);
            if(flag==1)doit();
            print();
            init();
        }
        else if(u==-1&&v==-1){//退出情况
            break;
        }else {//合并且求数据的组数
            unit(u,v);
            degree[v]++;
            vec.push_back(u);
            vec.push_back(v);
        }
    }
    return 0;
}

版本2


/*
1.只有一个根
2.不能成环
3.除了根节点其他节点的入度为1
*/
#include 
#include 
#include 
#include 
using namespace std;
const int maxn=1e6+5;
int fa[maxn],degree[maxn];
int cnt=1;
bool flag=true;
sets;
set::iterator it;
int father(int x){//查找父节点
    return fa[x]==x?x:father(fa[x]);
}
void unit(int u,int v){//联合节点u和v
    int x=father(u);
    int y=father(v);
    if(x!=y)fa[y]=x;
    else flag=false;//成环了

}
void init(){//初始化
    flag=true;
    for(int i=0;i

你可能感兴趣的:(树)