数据结构与算法实验题-战争来了
★实验任务
兽族和不死又要开战了。但是兽族的军队都是分部落管理的,为此,兽王 ——先知萨尔,要先知道自己能调度多少军队,才能在跟不死族开战的时候做好部署。已知现在兽族有
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