E - Is It A Tree?

题目:

A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties. 

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

The input will consist of a sequence of descriptions (test cases) followed by a pair of negative integers. Each test case will consist of a sequence of edge descriptions followed by a pair of zeroes Each edge description will consist of a pair of integers; the first integer identifies the node from which the edge begins, and the second integer identifies the node to which the edge is directed. Node numbers will always be greater than zero.

Output

For each test case display the line "Case k is a tree." or the line "Case k is not a tree.", where k corresponds to the test case number (they are sequentially numbered starting with 1).

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.

题意:

这道题和    《B - 小希的迷宫》    https://blog.csdn.net/titi2018815/article/details/81534109

的题意差不多嘛,我把那个代码改了改就对了;

思路:

这道题主要就是然我们判断给出的图是否是一棵树,那么我们就可以由树的定义来做这道题;

注意,输入 0 0时,是一棵树。

代码如下:

#include<stdio.h>
#include<string.h>
#define N 100010

int book[N],f[N];
int x,y;
int flag,sum;

void init()//初始化,每个人的祖宗都是自己;
{
    for(int i=1;i<=N;i++)
        f[i]=i;
    return ;
}

int getf(int v)//找祖宗;
{
    if(f[v]==v)
        return v;
    else
        return f[v]=getf(f[v]);
}

void merge(int v,int u)//判断两个人是否是同一个祖宗,即是否在同一个集合里;
{
    int t1=getf(v);
    int t2=getf(u);
    if(t1!=t2)//祖宗不同,“靠左”原则,把u的祖宗变成和v一样;
        f[t2]=t1;//即,两个人在同一个集合里;
    else
        flag=1;//否则就有多条路,不符合题意,标记一下;
    return ;
}

int main()
{
    int kk=1;
    while(~scanf("%d%d",&x,&y))
    {
        if(x==-1&&y==-1)
            break;
        if(x==0&&y==0)//注意;
        {
            printf("Case %d is a tree.\n",kk++);
            continue;
        }
        init();//初始化;
        sum=0;
        flag=0;
        memset(book,0,sizeof book);
        merge(x,y);
        book[x]=1;
        book[y]=1;
        while(~scanf("%d%d",&x,&y))
        {
            if(x==0&&y==0)
                break;
            merge(x,y);
            book[x]=1;
            book[y]=1;
        }
        for(int i=1;i<=N;i++)//判断树是否联通,即是否在同一个集合中
        {                    //如果在同一个集合中,那么就只有一个祖宗;
            if(book[i]==1&&f[i]==i)
                sum++;
        }
        if(sum!=1)//有多个祖宗,即树不联通;
            flag=1;
        if(flag==1)
            printf("Case %d is not a tree.\n",kk++);
        else
            printf("Case %d is a tree.\n",kk++);
    }
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Here is an example C++ program that creates a tree node at a specific position in a tree: ```c++ #include <iostream> #include <vector> using namespace std; struct TreeNode { int val; vector<TreeNode*> children; TreeNode(int x) : val(x) {} }; void createNode(TreeNode* root, vector<int> path, int pos, int val) { if (pos == path.size()) { root->children.push_back(new TreeNode(val)); return; } int index = path[pos]; createNode(root->children[index], path, pos + 1, val); } int main() { TreeNode* root = new TreeNode(1); root->children.push_back(new TreeNode(2)); root->children.push_back(new TreeNode(3)); root->children.push_back(new TreeNode(4)); vector<int> path = {1, 0}; // path to the node we want to create int val = 5; // value of the new node createNode(root, path, 0, val); // print the tree to verify the new node was added cout << root->val << endl; for (auto child : root->children) { cout << " " << child->val << endl; for (auto grandchild : child->children) { cout << " " << grandchild->val << endl; } } return 0; } ``` In this program, we define a `TreeNode` struct that represents a node in a tree. Each node has a `val` property representing its value, and a `children` vector representing its children. The `createNode` function takes a `root` parameter representing the root of the tree, a `path` parameter representing the path to the node we want to create (as a vector of indices), a `pos` parameter representing the current position in the path, and a `val` parameter representing the value of the new node. The function recursively traverses the tree along the path until it reaches the position where the new node should be created, and then adds the new node as a child of the current node. In the `main` function, we create a sample tree and then call the `createNode` function to add a new node with value 5 at position [1, 0] (i.e., the second child of the root's first child). We then print the tree to verify that the new node was added correctly.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值