树结构练习——判断给定森林中有多少棵树
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
众人皆知,在编程领域中,C++是一门非常重要的语言,不仅仅因为其强大的功能,还因为它是很多其他面向对象语言的祖先和典范。不过这世上几乎没什么东西是完美的,C++也不例外,多继承结构在带来强大功能的同时也给软件设计和维护带来了很多困难。为此,在java语言中,只允许单继承结构,并采用接口来模拟多继承。KK最近获得了一份java编写的迷你游戏的源代码,他对这份代码非常感兴趣。这份java代码是由n个类组成的(本题不考虑接口),现在,他想要知道这份代码中有多少个类没有直接基类。n个类分别用数字1..n表示。
Input
输入数据包含多组,每组数据格式如下。
第一行包含两个整数n,m,表示该份代码中的n个类和m个单继承关系。
后面m行,每行两个整数a b,表示a是b的直接基类。
Output
对于每组输入,输出该组数据中有多少个类没有直接基类。每组输出占一行。
Example Input
2 1 1 2 2 0
Example Output
1 2
DQE:
水水水题,化繁为简,排除法做soeasy,数组尺寸适当大一些。
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 #define MVN 1010 //数组尺寸太小会R T E 6 7 typedef struct VType 8 { 9 int x; 10 int id; 11 char *info; 12 }VT; 13 14 typedef struct GraphType 15 { 16 VT vex[MVN]; 17 int ZERO_v; //假设开始全为树,后排除,计数用 18 int vexn,arcn; 19 }GT; 20 21 void creat(GT &G) 22 { 23 int i,j,k; 24 G.ZERO_v=G.vexn; 25 for(i=1;i<=G.vexn;i++) 26 G.vex[i].id=0; 27 for(k=1;k<=G.arcn;k++) 28 { 29 scanf("%d %d",&i,&j); 30 if(G.vex[j].id==0||G.vex[i].id==0) //注意此处i,j的入度有一个为0则减少一颗树--3 2--1->2--3->2 31 { 32 G.ZERO_v--; //入度为零的顶点本为独立树,有基类则树少1 33 G.vex[j].id++; 34 } 35 } 36 } 37 38 int main() 39 { 40 GT G; 41 while(scanf("%d %d",&G.vexn,&G.arcn)!=EOF) 42 { 43 creat(G); 44 printf("%d ",G.ZERO_v); 45 } 46 return 0; 47 } 48 49 /*************************************************** 50 User name: *** 51 Result: Accepted 52 Take time: 0ms 53 Take Memory: 164KB 54 Submit time: 2016-11-18 20:42:55 55 ****************************************************/