题目大意:
已知有n头牛,知道m个产奶量的关系,问至少还要多少次比较,才能从小到大排序。
题目·分析:
其实这题就是金典的珍珠,只不过是要求的复杂点,不用作太大变动。如果超时的话,可以用邻接表做。
标程:
const
maxv=10001;
maxe=2000;
var
d,c:array[1..maxe,0..maxv] of longint;
f:array[0..maxe,0..maxe] of boolean;
i,j,k,x,y:longint;
n,m:longint;
ans:longint;
begin
read(n,m);
for i:=1 to m do
begin
readln(x,y);
f[x,y]:=true;
inc(d[x,0]);//插入邻接表
d[x,d[x,0]]:=y; //d[x]表示比x小的牛的编号,d[x,0]表示有多少个
inc(c[y,0]); //同理
c[y,c[y,0]]:=x; //c[y]表示比x大的牛的编号,d[x,0]表示有多少个
end;
for k:=1 to n do
for i:=1 to c[k,0] do
begin
x:=c[k,i];
for j:=1 to d[k,0] do
begin
y:=d[k,j];
if not f[x,y]
then
begin
d[x,0]:=d[x,0]+1; {增加新的关系}
d[x,d[x,0]]:=y;
c[y,0]:=c[y,0]+1;
c[y,c[y,0]]:=x;
f[x,y]:=true;
ans:=ans+1; {如果没有关系,则ans+1,ans初始为m}
end;
end;
end;
write(n*(n-1) div 2-ans-m);
end.