【并查集】mty的考验
题目:mty的考验 rqnoj343
题目描述
啊!几经周折.mty终于找到了他的偶像.他就是....fyc!
可是fyc这样的高级人士可不喜欢一个人总是缠着他.于是他出了一道难题想考考mty.fyc有几个手下:陈乐天,舒步鸡,胡巍......现在fyc要去和别人fight,需要组建一值军队.军队的士兵在fyc的手下里选.
要组建一个军队,必修满足军队中的每个人之间都有直接或间接的朋友关系.
那么mty现在需要组建一支在满足上述情况下的人数最多的军队.
问题规模:
对于100%的数据,1<=n<=1000,1<=m<=500.
输入格式
第一行,两个数,n,m.(n表示fyc有几个手下m表示有m对朋友关系).
一下m行,每行两个数.x[i],y[i].表示编号为x[i],y[i]的人是朋友.
输出格式
一个数,表示人数最多的军队的人数.
样例输入
样例输出
这个不用解释了吧,换了一个背景而已。。。
Pascal Code
program rqnoj343;
var
n,m:longint;
f:array[0..5000+10] of longint;
procedure init;
begin
end;
procedure outit;
begin
close(input);
close(output);
halt;
end;
procedure predoing;
var i:longint;
begin
for i:=1 to n do
f[i]:=i;
end;
function find(x:longint):longint;
begin
if f[x]=x then exit(x);
f[x]:=find(f[x]);
exit(f[x]);
end;
procedure insert(x,y:longint);
var rx,ry:longint;
begin
rx:=find(x);
ry:=find(y);
f[rx]:=ry;
end;
procedure readdata;
var
i,x,y:longint;
begin
read(n,m);
predoing;
for i:=1 to m do
begin
read(x,y);
insert(x,y);
end;
end;
procedure swap(var a,b:longint);
var t:longint;
begin
t:=a;a:=b;b:=t;
end;
procedure qsort(l,r:longint);
var
i,j,x:longint;
begin
i:=l;j:=r;x:=f[(i+j)div 2];
repeat
while f[i]<x do inc(i);
while f[j]>x do dec(j);
if i<=j then
begin
swap(f[i],f[j]);
inc(i);dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
procedure main;
var
i,num,max:longint;
begin
for i:=1 to n do
f[i]:=find(i);
qsort(1,n);
num:=0;max:=0;
for i:=2 to n do
begin
if f[i]=f[i-1] then inc(num);
if (f[i]<>f[i-1])or(i=n) then
begin
if num>max then max:=num;
num:=1;
end;
end;
writeln(max);
end;
begin
init;
readdata;
main;
outit;
end.

..... 转载请注明出处 ..... http://oijzh.cnblogs.com ..... by jiangzh
浙公网安备 33010602011771号