题解 | Is It A Tree?

#include <bits/stdc++.h>
using namespace std;

const int MAXN=10000;

int father[MAXN];
int height[MAXN];

int inDegree[MAXN];
bool visit[MAXN];

void init(int n){
    for(int i=0;i<n;i++){
        father[i]=i;
        height[i]=0;
        inDegree[i]=0;
        visit[i]=false;
    }
}

int Find(int x){
    if(x!=father[x]) father[x]=Find(father[x]);
    return father[x];
}

void Union(int x,int y){
    x=Find(x);
    y=Find(y);
    if(x!=y){
        if(height[x]<height[y])father[x]=y;
        else if(height[y]<height[x]) father[y]=x;
        else {
            father[y]=x;
            height[x]++;
        }
    }
}

bool isTree(){
    bool flag=true;
    int component=0;
    int root=0;
    for(int i=0;i<MAXN;i++){
        if(!visit[i])continue;
        if(father[i]==i)component++;
        if(inDegree[i]==0)root++;
        else if(inDegree[i]>1)flag=false;
        if(component!=1||root!=1)flag=false;
        if(component==0&&root==0)flag=true;
        
    }
    return flag;
}

int main(){
    int x,y;
    int caseNum=0;
    init(MAXN);
    while(cin>>x>>y){
        if(x==-1&&y==-1)break;
        if(x==0,y==0){
            if(isTree())cout<<"Case "<<++caseNum<<" is a tree."<<endl;
            else cout<<"Case "<<++caseNum<<" is not a tree."<<endl;
            init(MAXN);
        }else {
            Union(x,y);
            inDegree[y]++;
            visit[x]=true;
            visit[y]=true;
        }
    }
}

本题难度在如何判断是否为树,判断树的条件非常简单,就是判断入度即可,我们可以把这些节点的入度都存储一下,入度为0的情况就是根节点,且可以根据入度大于1判断为非树结构,然后解释一下为什么要用visit,因为我们要生成一个唯一的树,不能是分裂的,所以必须在假如的节点中去查询,所以这里要进行标记,然后要注意一点,定义上允许空树为树,所以要写上这一点的特殊判断。

全部评论

相关推荐

03-02 16:31
已编辑
合肥工业大学 golang
程序员鼠鼠_春招版:学历可以,项目普通,评价多余,奖项没有,如果有面试都是因为学历给你的,我建议可以随便包几个奖项上去,像什么蓝桥杯天梯赛,虽然不一定有用,但是相比acm这种风险小多了,我几段实习下来,压根没查的,第二点是包一段小厂实习,大厂你不好拿捏,小厂打打杂也能让你在26里面出彩一点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务