奶牛的比赛(contest)


题目描述

    FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:)。在赛场上,奶牛们按1..N依次编号。每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平不相上下,也就是说,奶牛们的编程能力有明确的排名。
    整个比赛被分成了若干轮,每一轮是两头指定编号的奶牛的对决。如果编号为A的奶牛的编程能力强于编号为B的奶牛(1 <= A <= N; 1 <= B <= N; A != B),那么她们的对决中,编号为A的奶牛总是能胜出。
    FJ想知道奶牛们编程能力的具体排名,于是他找来了奶牛们所有M(1 <= M <= 4,500)轮比赛的结果,希望你能根据这些信息,推断出尽可能多的奶牛的编程能力排名。比赛结果保证不会自相矛盾。


[3]奶牛的比赛(contest)
这题可以用一个弗洛伊德(Floyed)算法做。
首先用一个数组存每头奶牛分别的比赛结果,F[i,j]记录第i头奶牛和第j头奶牛比赛的结果(谁获胜)所以F[i,j]=i 那么我们只需要用弗洛伊德的专署格式:三重循环,分别枚举k,i,j,然后判断i是否等于j,然后就看看F[i,k]的胜者是否为i ,F[k,j]是否是k。就可以把F[i,j]和F[j,i]设为i了。
最后判断每只奶牛是否跟所有牛都比赛过了,如果是,那么就inc(ans)。



for j:=1 to m do
        begin
                readln(x,y);
                f[x,y]:=x;
                f[y,x]:=x;
        end;
        for k:=1 to n do
                for i:=1 to n do
                        for j:=1 to n do
                                if (i<>j)and(f[i,j]=0) then
                                begin
                                        if (f[i,k]=i)and(f[k,j]=k) then
                                        begin
                                                f[i,j]:=i;
                                                f[j,i]:=i;
                                        end;
                                end;
        for i:=1 to n do
        begin
                s:=0;
                for j:=1 to n do
                begin
                        if f[i,j]<>0 then inc(s);
                end;
                if s=n-1 then inc(ans);
        end;


你可能感兴趣的:(奶牛的比赛(contest))