2016年提高组模拟题(20161114) 锦标赛 ssl 2571 差分约束系统

这里写图片描述

分析

题目中的限制条件可以改写为 Y<=X
如果我们有这些限制 Y<=X和 Z<=Y,那么我们可以得到一个新的限制 Z<=X,并且这可以和原来的限制合并在一起。
我们最终的目标是找到缺失的两个人的限制.
所以我们应该去寻找他两的的限制——也就是求最短路。(差分约束系统)

代码

const
  maxe=10000;
  maxv=20000;

type
  arr=record
    x,y,w,next:longint;
end;

var
  n,m:longint;
  a:array[0..maxv] of arr;
  b:array[0..2] of longint;
  f:array[0..maxe] of longint;
  d:array[0..maxe] of longint;
  i,j,k:longint;
  s,t:longint;
  flag,flaj:boolean;
  max:longint;

procedure relax(u,v,w:longint);
begin
  if d[u]+w<d[v] then
    d[v]:=d[u]+w;
end;

procedure bellman;
var
  i,j:integer;
begin
  for i:=1 to n do
    for j:=1 to m do
      with a[j] do relax(x,y,w);
  for i:=1 to m do
    with a[i] do
      if d[x]+w<d[y] then begin
        flag:=true;
        exit;
      end;
  flag:=false;
end;

begin
  readln(n);
  fillchar(a,sizeof(a),0);
  fillchar(d,sizeof(d),$7f);
  m:=n*(n-1) div 2-1;
  max:=d[1];
  for j:=1 to m do
    begin
      with a[j] do
        begin
          read(x,y);
          f[x]:=f[x]+1;
          f[y]:=f[y]+1;
          w:=w+1;
        end;
    end;
  for i:=1 to n do
    if f[i]<>n-1
      then begin
        b[0]:=b[0]+1;
        b[b[0]]:=i;
      end;
  s:=b[1]; t:=b[2];
  flaj:=false;
  d[s]:=0;
  bellman;
  if d[t]<>max then begin
    writeln(s,' ',t);
    flaj:=true;
  end;
  fillchar(d,sizeof(d),$7f);
  d[t]:=0;
  bellman;
  if (d[s]<>max) and not flaj
    then begin
      writeln(t,' ',s);
      flaj:=true;
    end;
  if not flaj
    then writeln(s,' ',t);
  close(input);
  close(output);
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值