sicily 1034. Forest

原创 2015年11月17日 20:48:04

1034. Forest

Constraints

Time Limit: 1 secs, Memory Limit: 32 MB

Description

In the field of computer science, forest is important and deeply researched , it is a model for many data structures . Now it’s your job here to calculate the depth and width of given forests.

     Precisely, a forest here is a directed graph with neither loop nor two edges pointing to the same node. Nodes with no edge pointing to are roots, we define that roots are at level 0 . If there’s an edge points from node A to node B , then node B is called a child of node A , and we define that B is at level (k+1) if and only if A is at level k .

      We define the depth of a forest is the maximum level number of all the nodes , the width of a forest is the maximum number of nodes at the same level.

Input

There’re several test cases. For each case, in the first line there are two integer numbers n and m (1≤n≤100, 0≤m≤100, m≤n*n) indicating the number of nodes and edges respectively , then m lines followed , for each line of these m lines there are two integer numbers a and b (1≤a,b≤n)indicating there’s an edge pointing from a to b. Nodes are represented by numbers between 1 and n .n=0 indicates end of input.

Output

For each case output one line of answer , if it’s not a forest , i.e. there’s at least one loop or two edges pointing to the same node, output “INVALID”(without quotation mark), otherwise output the depth and width of the forest, separated by a white space.

Sample Input

1 01 11 13 11 32 21 22 10 88

Sample Output

0 1INVALID1 2INVALID

题目分析

求森林最大宽度与深度
拓扑排序,若存在环则失败
每轮确定入度为零的节点数即为该层的宽度
轮数即为深度
一直WA是忽略了题目还限制了不存在两条边指向一个节点,即每个点的入度必须<=1


#include <iostream>
#include <vector>
#include <memory.h>

struct Node {
  int indegree;
  std::vector<int> child;
};

int main()
{
  int num, edge;
  while (std::cin >> num >> edge && num != 0) {
    Node nodes[num+1];
    for (int i = 1; i <= num; ++i) {
      nodes[i].indegree = 0;
    }
    bool visited[num+1];
    memset(visited, false, sizeof(visited));

    bool valid = true;
    int papa, son;
    for (int i = 0; i < edge; ++i) {
      std::cin >> papa >> son;
      nodes[son].indegree++;
      nodes[papa].child.push_back(son);
      if (nodes[son].indegree == 2)
        valid = false;
    }
    if (!valid) {
      std::cout << "INVALID" << std::endl;
      continue;
    }

    int height = -1;
    int width = 0;
    int count = 0;

    while (true) {
      std::vector<int> root;
      for (int i = 1;  i <= num; ++i) {
        if (!visited[i] && nodes[i].indegree == 0) {
          root.push_back(i);
        }
      }
      if (root.size() == 0)
        break;
      width = width < root.size() ? root.size() : width;
      for (int i = 0; i < root.size(); ++i) {
        visited[root[i]] = true;
        count++;
        for (int j = 0; j < nodes[root[i]].child.size(); ++j)
          nodes[nodes[root[i]].child[j]].indegree--;
      }
      height++;
    }
    if (count == num) std::cout << height << " " << width << std::endl;
    else std::cout << "INVALID" << std::endl;
  }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

sicily题目分类

sicily题目分类 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. ...
  • u010858667
  • u010858667
  • 2013年09月05日 11:52
  • 2151

Sicily 1135 飞越原野

广度优先搜索,三维数组判重 #include #include #include using namespace std; struct Node { int x,y,p; }; ch...
  • Detective_Xin
  • Detective_Xin
  • 2013年11月22日 11:19
  • 1318

[sicily]部分题目分类

*************************程序设计题************************* sicily 1293, uva 100, pc 110101, 3n+1数链问题, 难...
  • luohuang0423
  • luohuang0423
  • 2015年09月24日 11:20
  • 779

中山大学Sicily在线测评系统题目分类

Classified Problems on Online Judge 练习题选自以下在线测评系统 * sicily: http://soj.me, 中山大学Sicily在线测评系统 ...
  • cuhkljt
  • cuhkljt
  • 2013年06月26日 21:39
  • 4841

1034_有理数四则运算(20)

#include int gong(long long a,long long b) { long long r,min,max; min=(a>b)?b:a; max=(a>b)?a:b; ...
  • fang_abc
  • fang_abc
  • 2015年03月07日 09:43
  • 2325

sicily 简单哈希

sicily 1004. 简单哈希 原题: Description  使用链地址法(又称拉链法)可以解决Hash中的冲突问题。其基本思想是:将具有相同哈希地址的记录链成一个单链表,m个哈希地址就...
  • t6_17
  • t6_17
  • 2016年12月14日 21:26
  • 553

机器学习方法(六):随机森林Random Forest,bagging

前面[机器学习方法(四)决策树](http://blog.csdn.net/xbinworld/article/details/44660339)讲了经典的决策树算法,我们讲到决策树算法很容易过拟合,...
  • xbinworld
  • xbinworld
  • 2016年01月03日 21:47
  • 10463

Sicily求A-B(也即求A对B的差集)

题目描述思路介绍:①使用vector存储AB ②使用unique与erase对AB分别进行去重 ③开辟一个标记数组,使用二重循环...
  • wyxwyx469410930
  • wyxwyx469410930
  • 2017年12月22日 00:29
  • 58

sicily 1215 脱离地牢

做Sicily 1215脱离地牢 这一题,一直Restrict function,都快崩溃了。 最后发现是内存泄露,就是new出来的东西没有及时delete导致的。 具体是在广度优...
  • chz429
  • chz429
  • 2014年12月27日 10:25
  • 628

sicily 1019(动态规划)

题目链接:sicily 1019 题目分析:恶心的一笔的一道题,不过确实是一道好题。给你一棵树,n个结点,结点间距离为1,每个结点有一个值,第一次走过某个节点获得该结点的值,问用m步遍历树可以获得值...
  • fuyukai
  • fuyukai
  • 2015年04月18日 07:19
  • 396
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sicily 1034. Forest
举报原因:
原因补充:

(最多只允许输入30个字)