您的位置:首页 > 其它

bzoj1854: [Scoi2010]游戏

2017-06-26 21:18 351 查看
传送门

神奇的并查集。

我们可以将一个拥有属性A,B的武器看成A,B之间的一条无向边

如果一个联通块中边的条数==点数-1,

则必定有一个数无法被凑出

否则一定存在方案凑出所有数

对于一个联通块中边的条数==点数-1,

我们显然选择放弃最大的点。

然后并查集XJB搞一下就可以了

var
f,v:array [0..1000005] of longint;
n,i,x,y,p,q,t:longint;
function get(x:longint):longint;
begin
if (f[x]=x) then exit(x);
f[x]:=get(f[x]);
exit(f[x]);
end;
begin
read(n);
for i:=1 to n+1 do f[i]:=i;
for i:=1 to n do begin
read(x,y); p:=get(x); q:=get(y);
if (p=q) then v[p]:=1
else begin
if (p<q) then begin t:=p; p:=q; q:=t; end;
v[q]:=1; f[q]:=p;
end;
end;
for i:=1 to n+1 do
if (v[i]=0) then begin write(i-1); break; end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: