NOIP2010 关押罪犯

传送门

https://vijos.org/p/1776

题目大意

额,自己看吧

题解

对于这种有对立关系(只有1对)的时候,我们考虑拆点
x拆为x和x+n
按数值排序后,倒序合并,a和b+n以及b和a+n合并,如果a和b在一个集合中那么输出当前值
注意无冲突情况输出0

var
 x:array[0..100005,0..3]of longint;
 fa:array[0..40000]of longint;
 i,j,k:longint;
 n,m,a,b:longint;
procedure sort(l,r: longint);
var i,j,k,a,y: longint;
begin
 i:=l; j:=r; a:=x[(l+r) div 2,3];
 repeat
  while x[i,3]<a do inc(i);
  while a<x[j,3] do dec(j);
  if not(i>j) then
  begin
   for k:=1 to 3  do
    begin y:=x[i,k]; x[i,k]:=x[j,k]; x[j,k]:=y; end;
   inc(i); dec(j);
  end;
 until i>j;
 if l<j then sort(l,j);
 if i<r then sort(i,r);
end;

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,m);
 for i:=1 to m do
  readln(x[i,1],x[i,2],x[i,3]);
 sort(1,m); {x[i,3]}
 for i:=1 to 2*n do
  fa[i]:=i;
 for i:=m downto 1 do
  begin
   a:=get(x[i,1]); b:=get(x[i,2]);
   if a=b
   then begin writeln(x[i,3]); halt; end
   else begin
    fa[a]:=get(x[i,2]+n);
    fa[b]:=get(x[i,1]+n);
   end;
  end;
 writeln(0);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值