这道c++题怎么做啊

有一张n个点m条边的有向无环图(点从1到n编号)和一个初始为空的集合S,每次可以在有向图中取一个同时符合下列两个条件的点x加入集合S:
    1、x不在集合S中。
    2、对任意已经在S中的点y,原图中都应存在一条从x到y或从y到x的路径。
    当集合S为空的时候,你可以选择任何一个点添加。
    你的任务就是,在上述构造s的规则下,求出S最多能够包含多少个点。

 

 

输入输出格式

输入格式:

第一行一个正整数T,表示数据组数。
每组数据第一行有两个正整数n,m,表示该图的点数与边数。
接下来m行,每行两个正整数u,v,其中u<v,表示有一条点u到点v的有向边。

 

 

输出格式:

对每组数据输出一行一个正整数表示答案。

输入输出样例

输入样例#1: 复制

2
4 4
1 2
2 4
1 3
3 4
4 4
1 3
1 4
2 3
2 4

输出样例#1:

3
2

补充说明

在第一组数据中:可以依次添加点1、点4,点3或点2;第二组数据中,可以依次添加点1、点3。 对于30%的数据,n≤15 对于60%的数据,n≤1000 对于100%的数据,1≤T≤10 ; 1≤n≤10000 ;1≤m≤30000,输入中每行两个数 u,v 都满足 u

时间限制:1s 空间限制:256M

提供一些思路,你可以先偿试做一下做了以后有问题可以再问。

1.第一个点取的不同,最终点的数据会不一样。假设第一个点取编号为1的点,得到最张的S为S1,第一个点取编号为2的点,得到最张的S为S2,......第一个点取编号为n的点,得到最张的S为Sn,那么S1到SN中的最大值,即为答案。

2.计算S1到SN

每个点的计算方法都一样,我们假设取第i个点,现在求Si

第一步:将第i个点放在S的第一个位置。

第二步:从所由路径中找到存在i点的路径(i,x)或(x,i),路径中另一点x如果不在S中则把x入到x中

这一步就找出了所有跟i的直接路径点。

第三步:循环第二步找出的所有点,再重复第二步的操作,即找到这些点的直接路径点。把他们放入S中(已经存在的不必放入)。

第四步,再把第三步中找到的所有新点再重复作第二步和第三步操作,第三步的循环找不到任何新点为止。

这个时候就得到了Si

3.求出S1-SN的最大值

 

请提供你自己的想法,以及你碰到的具体的技术问题。