• PAT 甲级 1021 Deepest Root (并查集,树的遍历)


    1021. Deepest Root (25)

    时间限制
    1500 ms
    内存限制
    65536 kB
    代码长度限制
    16000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains a positive integer N (<=10000) which is the number of nodes, and hence the nodes are numbered from 1 to N. Then N-1 lines follow, each describes an edge by given the two adjacent nodes' numbers.

    Output Specification:

    For each test case, print each of the deepest roots in a line. If such a root is not unique, print them in increasing order of their numbers. In case that the given graph is not a tree, print "Error: K components" where K is the number of connected components in the graph.

    Sample Input 1:
    5
    1 2
    1 3
    1 4
    2 5
    
    Sample Output 1:
    3
    4
    5
    
    Sample Input 2:
    5
    1 3
    1 4
    2 5
    3 4
    
    Sample Output 2:

    Error: 2 components

    先求连通块,通过并查集,

    然后枚举每一个点dfs,

    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    const int maxn=1e4;
    int n;
    struct Node
    {
      int value;
      int next;
    }edge[maxn*2+5];
    int father[maxn+5];
    int head[maxn+5];
    int vis[maxn+5];
    int num[maxn+5];
    int tag[maxn+5];
    int tot,cnt;
    void add(int x,int y)
    {
      edge[tot].value=y;
      edge[tot].next=head[x];
      head[x]=tot++;
    }
    int find(int x)
    {
      if(father[x]!=x)
        father[x]=find(father[x]);
      return father[x];
    }
    void dfs(int root,int deep)
    {
      vis[root]=1;
      int tag=0;
      for(int i=head[root];i!=-1;i=edge[i].next)
      {
        int y=edge[i].value;
            if(!vis[y])
        {
          tag=1;
          dfs(y,deep+1);
        }
      }
      if(!tag)
        num[cnt]=max(num[cnt],deep);
    }
    int main()
    {
      scanf("%d",&n);
      int x,y;
      memset(head,-1,sizeof(head));
      for(int i=1;i<=n;i++)
        father[i]=i;
      tot=0;
      for(int i=1;i<n;i++)
      {
            scanf("%d%d",&x,&y);
            int fx=find(x);
        int fy=find(y);
        if(fx!=fy)
          father[fx]=fy;
        add(x,y);
        add(y,x);
      }
      memset(tag,0,sizeof(tag));
      int res=0;
      for(int i=1;i<=n;i++)
      {
        find(i);
        tag[father[i]]=1;
        }
      for(int i=1;i<=n;i++)
           if(tag[i])
           res++;
      if(res>1)
        printf("Error: %d components
    ",res);
      else
      {
        for(int i=1;i<=n;i++)
        {
                memset(vis,0,sizeof(vis));
          cnt=i;
          dfs(i,0);
        }
        int ans=0;
            for(int i=1;i<=cnt;i++)
          ans=max(ans,num[i]);
        for(int i=1;i<=cnt;i++)
          if(num[i]==ans)
            printf("%d
    ",i);
      }
      return 0;
    }


  • 相关阅读:
    JS实现继承,封装一个extends方法
    JS实现new关键字的功能
    前端常见原生方法的实现(bind,promise,new,extends,深拷贝,函数防抖,函数节流)
    Nodejs ORM框架Sequelize快速入门
    Nodejs ORM框架Sequelize(模型,关联表,事务,循环,及常见问题)
    NodeJs mysql 开启事务
    web开发的跨域问题详解
    docker网络
    docker容器的学习
    路飞学城的部署
  • 原文地址:https://www.cnblogs.com/dacc123/p/8228607.html
Copyright © 2020-2023  润新知