判断给定森林中有多少棵树特别版
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description
众人皆知,在编程领域中,C++是一门非常重要的语言,不仅仅因为其强大的功能,还因为它是很多其他面向对象语言的祖先和典范。不过这世上几乎没什么东 西是完美的,C++也不例外,多继承结构在带来强大功能的同时也给软件设计和维护带来了很多困难。为此,在java语言中,只允许单继承结构,并采用接口 来模拟多继承。KK最近获得了一份java编写的迷你游戏的源代码,他对这份代码非常感兴趣。这份java代码是由n个类组成的(本题不考虑接口),n个类分别用数字1..n表示。现在给你n个类之间的关系,有q次询问,每次询问某一个有多少个直接继承的子类。输入子类的个数和标号(标号按照字典序大小输出)。
Input
首先输入一个整数T,表示数据的组数。每组数据格式如下。
第一行包含两个整数n,m,表示该份代码中的n个类和m个单继承关系(1<=m< n<=10^5)
Output
对于每组输入。输出询问类的子类的数量和编号。
Example Input
1
10 9
2 1
3 2
4 3
5 3
6 3
7 3
8 3
9 3
10 5
10
7
6
3
7
1
2
8
1
2
5
Example Output
0
0
6
4 5 6 7 8 9
0
1
2
1
3
0
1
2
1
3
1
10
Hint
Author
JueChen
真的是一道比较好的题目,记得有一道相似的题目,那是一道并查集,直接模板就可以解决,但是这道题要存储,而且根据输出,可以自然而然的想到邻接表!
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
struct node
{
int data;//数字是多少
int num;//后面的个数
struct node * next;//指向下一个数字
}T[1233456];
struct node creat(struct node t, int k)//将k按照字典序插入
{
struct node * p;
p = &t;
while(p->next&&p->data<k)
p = p->next;//寻找插入的位置
struct node * q =(struct node *)malloc(sizeof(struct node));
q->data = k;
q->next = p->next;
p->next = q;
return t;
};
int main()
{
int t, x, y, n, m;
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)//初始化
{
T[i].data = i;
T[i].num = 0;
T[i].next = NULL;
}
while(m--)
{
cin>>x>>y;
T[y] = creat(T[y], x);
T[y].num++;//每次都要增加1
}
cin>>m;
while(m--)
{
cin>>x;
cout<<T[x].num<<endl;
if(T[x].num!=0)
{
struct node * p = T[x].next;
while(p->next)
{
cout<<p->data<<' ';
p = p->next;
}
cout<<p->data<<endl;
}
}
}
return 0;
}