简化版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
.