数据结构与算法实验题-战争来了

★实验任务
兽族和不死又要开战了。但是兽族的军队都是分部落管理的,为此,兽王 ——先知萨尔,要先知道自己能调度多少军队,才能在跟不死族开战的时候做好部署。已知现在兽族有
N 个兽人,编号从 1 到 N。其中有一些兽人是其他兽人的部下,并且这种下属关系是可以传递的。例如 1 是 2 的部下,2 是 3 的部下,那么 1 也是 3 的部下。如果,一个兽人 1 先是兽人 2 的部下,后是兽人 3 的部下,那么 2 也将变成 3 的部下(谁让你的人跟人家跑了呢,你也得跟着呗)。哎,兽族就是这么一个残酷的种族。

现在,只要萨尔找到一个统领的兽人,那么那个兽人的的所有部下都能被萨尔调度。

求萨尔至少需要找几个兽人统领,才能调度所有的 N 个兽人。

★数据输入
输入第一行两个正整数 N 和 M(0<N<=100000,0<M<=100000)。
接下来有 M 行。每行为两个数 A,B(1<=A,B<=N),表示编号 A 的兽人是编号 B 的兽
人的部下。
★数据输出
输出两行。
第一行为一个整数,表示萨尔需要找几个兽人统领才能调度 N 个兽人。
第二行输出兽人统领的编号(从小到大)。

输入示例 
6 5
1 2
3 4
5 6
3 5
4 5

输出示例

2
2 6



竟然出新题目了!!!

虽然我上次做完了

并查集水题。。。

代码已经写完。够水!

代码等12月6号贴

------------------12月6号上传代码-------------------

半小时做完的两题全对。。我就不明白你们怎么都想那么多。。。

都还搞出环来了。。。根本没必要,本来就无影响。。

#include<cstdio>
const int MAXN=100000+10;
int fa[MAXN];
int ans[MAXN];
int find(int cur)
{
	return cur==fa[cur]? cur : fa[cur]=find(fa[cur]);
}

int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	
	int a,b;
	int i;
	for(i=1;i<=n;i++)
		fa[i]=i;

	for(i=0;i<m;i++)
	{
		scanf("%d%d",&a,&b);
		int roota=find(a);
		int rootb=find(b);
		fa[roota]=rootb;
	}
	int cnt=0;
	for(i=1;i<=n;i++)
		if(i==fa[i])	
			ans[cnt++]=i;

	printf("%d\n",cnt);
	for(i=0;i<cnt;i++)
		printf("%d ",ans[i]);
	printf("\n");
	return 0;
}   




        

posted @ 2013-11-28 12:55  hr_whisper  阅读(231)  评论(0)    收藏  举报