数据结构与算法实验题-战争来了
★实验任务
兽族和不死又要开战了。但是兽族的军队都是分部落管理的,为此,兽王 ——先知萨尔,要先知道自己能调度多少军队,才能在跟不死族开战的时候做好部署。已知现在兽族有
N 个兽人,编号从 1 到 N。其中有一些兽人是其他兽人的部下,并且这种下属关系是可以传递的。例如 1 是 2 的部下,2 是 3 的部下,那么 1 也是 3 的部下。如果,一个兽人 1 先是兽人 2 的部下,后是兽人 3 的部下,那么 2 也将变成 3 的部下(谁让你的人跟人家跑了呢,你也得跟着呗)。哎,兽族就是这么一个残酷的种族。
兽族和不死又要开战了。但是兽族的军队都是分部落管理的,为此,兽王 ——先知萨尔,要先知道自己能调度多少军队,才能在跟不死族开战的时候做好部署。已知现在兽族有
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;
}
新 blog : www.hrwhisper.me

浙公网安备 33010602011771号