[BZOJ1370] [Baltic2003]Gang团伙

传送门

http://www.lydsy.com/JudgeOnline/problem.php?id=1370

题目大意

给定n个人,朋友的朋友是朋友,敌人的敌人是朋友,朋友之间组成一个团伙,求团伙数

题解

并查集
我们来拆点,x拆为x和x+n
如果两个人是朋友,合并a和b
如果两个人是敌人,合并a和b+n,以及b和a+n

朋友的朋友显然满足
敌人的敌人,a和b是敌人,b和c是敌人,{a,b+n,c}{a+n,b,c+n}

var
 x,fa:array[0..3000]of longint;
 i,j,k:longint;
 n,m:longint;
 a:char;
 b,c,ans:longint;
function get(a:longint):longint;
begin
 if fa[a]=a then exit(a);
 fa[a]:=get(fa[a]);
 exit(fa[a]);
end;

begin
 readln(n); readln(m);
 for i:=1 to 2*n do
  fa[i]:=i;
 for i:=1 to m do
  begin
   readln(a,b,c);
   if a='E'
   then begin fa[get(c+n)]:=get(b); fa[get(b+n)]:=get(c); end
   else begin fa[get(b)]:=get(c); end;
  end;
 fillchar(x,sizeof(x),0);
 ans:=0;
 for i:=1 to n do
  if x[get(i)]=0
  then begin inc(ans);  x[get(i)]:=1;end;
 writeln(ans);
end.
    原文作者:犯罪团伙问题
    原文地址: https://blog.csdn.net/slongle_amazing/article/details/48687563
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞