[vijos P1034] 家族

寒假给自己定的第一个目标就是把并查集,Tarjan之类搞会。翻了翻笔记,发现并查集是2012年的6月30日学的…早就忘光了…今天敲题目的时候也吃了不少的亏呢…

家族这一题就是并查集的标准题,第一次提交失误了,我的union子过程莫名陷入了死循环,我的f数组存在死循环,最后发现是find函数有个bug…

我又跑去参考NOCOW了,只是觉得一直参考标程不是太好,毕竟比赛的时候得独立debug是吧…

核心代码就是union子过程和find函数了,其实也没什么技术含量,思路比较要紧。过会儿去研究下,这个算法貌似还有什么优化来着~

[vijos P1034] 家族
program vijos_p1034;
var f:array[1..5000] of integer;
    i,j,n,p,m,mi,mj,li,lj,pi,pj:integer;
function find(x:integer):integer;
var t:integer;
begin
  if f[x]=x then exit(x) else f[x]:=find(f[x]);
  exit(f[x]);
end;

procedure union(x,y:integer);
var fx,fy:integer;
begin
  fx:=find(x);
  fy:=find(y);
  if fx<>fy then f[fx]:=fy;
end;

begin
  readln(n,m,p);
  for i:=1 to n do
    f[i]:=i;
  for i:=1 to m do
    begin
      readln(mi,mj);
      union(mi,mj);
    end;
  for i:=1 to p do
    begin
      readln(pi,pj);
      li:=find(pi);
      lj:=find(pj);
      if li=lj then writeln(Yes) else writeln(No);
    end;
end.
家族

[vijos P1034] 家族

上一篇:小强的HTML5移动开发之路(25)—— AppCan开发环境


下一篇:MySQL数据库中的高级(进阶)语句:VIEW视图、联集和常见计算(长大之后,发现满世界对你承诺,而你不敢承诺,只能忍让,偏偏忍无可忍。所有的食物都不卫生,所有的爱情都不正直,于是你依旧是个毫无依赖的小孩。)