关系并查集 食物链

简化版01关系(对立关系)简便写法:设立一个反面,i与i+n相反

附代码:

var n,m,i,j,k,a,b,u,v:longint;
father,team,cnt:array[0..100005] of longint;

function getfather(v:longint):longint;
begin
if father[v]=v then exit(v);
father[v]:=getfather(father[v]);
exit(father[v]);
end;

procedure merge(x,y:longint);
var u,v:longint;
begin
u:=getfather(x);
v:=getfather(y);
father[u]:=v;
end;

begin
readln(n,m);
for i:=1 to 2*n do father[i]:=i;
for i:=1 to m do begin
    readln(a,b);
    merge(a,b+n);
    merge(a+n,b);
    if getfather(a)=getfather(b) then begin writeln(i);halt;end;
    end;
writeln('OK');
end.

 

 

一下是食物链的代码:

var n,m,i,j,k,l,ans,a,b,u,v:longint;

father,dist:array[0..50005] of longint;

 

 

function getfather(v:longint):longint;

var t:longint;

begin

if father[v]=v then exit(v);

t:=father[v];

father[v]:=getfather(father[v]);

dist[v]:=(dist[t]+dist[v]) mod 3;

exit(father[v]);

end;

 

begin

readln(N,m);

for i:=1 to n do father[i]:=i;

for m:=m downto 1 do

    begin

    readln(k,a,b);

    if (a>n)or(b>n)or(k=2)and(a=b) then begin inc(ans);continue;end;

    dec(k);

    u:=getfather(a);

    v:=getfather(b);

    if u=v then

        if (dist[a]-dist[b]+3) mod 3<>k then inc(ans);

    if u<>v then

        begin

        father[u]:=v;

        dist[u]:=(k-dist[a]+dist[b]+3) mod 3;

        end;

    end;

writeln(ans);

end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值