现在的位置: 首页 > 综合 > 正文

【并查集】mty的考验

2013年03月09日 ⁄ 综合 ⁄ 共 1456字 ⁄ 字号 评论关闭

题目: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.

 

 

抱歉!评论已关闭.