usaco3.1.1 agrinet

http://hi.baidu.com/raulliubo/blog/item/b91fec249f207e378744f9a6.html

 

!!神奇了。。刚才又交了一遍kruskal的程序,竟然tmd AC了。。难道这就是传说中的RPWT。。我的RP低到极点了。

USER: BO LIU [raulliu2]
TASK: agrinet
LANG: PASCAL

Compiling...
Compile: OK

Executing...
      Test 1: TEST OK [0 secs]
      Test 2: TEST OK [0 secs]
      Test 3: TEST OK [0 secs]
      Test 4: TEST OK [0.004 secs]
      Test 5: TEST OK [0.004 secs]
      Test 6: TEST OK [0 secs]
      Test 7: TEST OK [0.004 secs]
      Test 8: TEST OK [0.004 secs]
      Test 9: TEST OK [0.004 secs]
      Test 10: TEST OK [0.012 secs]

All tests OK.

Your program ('agrinet') produced all correct answers! This is your
submission #4 for this problem. Congratulations!
标准MST,啥优化都不要。。刚开始用kruskal做的。。不知道怎么回事老是WA on test5....很郁闷的说。只得改用prim。。。我可不喜欢prim啊。。。。

my ugly code :

PRIM:

{
PROG:agrinet
ID:parachutes
LANG:PASCAL
}

var
    map : array[1 .. 100, 1 .. 100] of longint;
    d : array[1 .. 100] of longint;
    mark : array[1 .. 100] of boolean;
    n, i, ans, j : longint;
   
procedure prim;
var
    i, j, min, minj : longint;
begin
    fillchar(mark, sizeof(mark), 0);
    mark[1] := true;
    for i := 1 to n do begin
        if map[1, i] <> 0 then d[i] := map[1, i]
        else d[i] := maxlongint;
    end;
    ans := 0;
    for i := 2 to n do begin
        min := maxlongint;
        for j := 1 to n do begin
            if (not mark[j]) and (d[j] < min) then begin
                min := d[j];
                minj := j;
            end;
        end;
        mark[minj] := true;
        inc(ans, d[minj]);
        for j := 1 to n do
            if (d[j] > map[minj, j]) and (map[minj, j] <> 0) then
                d[j] := map[minj, j];
    end;
end;

begin
    assign(input,'agrinet.in'); reset(input);
    assign(output,'agrinet.out'); rewrite(output);
    readln(n);
    for i := 1 to n do begin
        for j := 1 to n do
            read(map[i, j]);
        readln;
    end;
    prim;
    writeln(ans);
    close(input); close(output);
end.

===================================强大的分割线====================================

{
PROG:agrinet
ID:parachutes
LANG:PASCAL
}

var
    x, j, tot, i, n : longint;
    l, a, b : array[1 .. 10000] of longint;
    f : array[1 .. 100] of longint;
    v : array[1 .. 100, 1 .. 100] of boolean;

procedure qsort(ll, rr : longint);
var
    i, j, mid, temp : longint;
begin
    i := ll; j := rr; mid := l[(i + j) shr 1];
    repeat
        while l[i] < mid do inc(i);
        while l[j] > mid do dec(j);
        if i <= j then begin
            temp := l[i]; l[i] := l[j]; l[j] := temp;
            temp := a[i]; a[i] := a[j]; a[j] := temp;
            temp := b[i]; b[i] := b[j]; b[j] := temp;
            inc(i); dec(j);
        end;
    until i > j;
    if i < rr then qsort(i, rr);
    if ll < j then qsort(ll, j);
end;

function find(x : longint) : longint;
var
    tmp : longint;
begin
    if f[x] = x then exit(x)
    else exit(find(f[x]));
end;

procedure union(u, v : longint);
var
    fu, fv : longint;
begin
    fu := find(u);
    fv := find(v);
    f[fv] := fu;
end;

procedure kruskal;
var
    cnt, i, ans : longint;
begin
    for i := 1 to n do f[i] := i;
    cnt := 0;
    ans := 0;
    for i := 1 to tot do
        if (find(a[i]) <> find(b[i])) then begin
            union(a[i], b[i]);
            ans := ans + l[i];
            inc(cnt);
            if cnt = n - 1 then break;
        end;
    writeln(ans);
end;

begin
    assign(input,'agrinet.in'); reset(input);
    assign(output,'agrinet.out'); rewrite(output);
    fillchar(v, sizeof(v), 0);
    tot := 0;
    readln(n);
    for i := 1 to n do begin
        for j := 1 to n do begin
            read(x);
            if (not v[i, j]) and (i <> j) then begin
                inc(tot);
                a[tot] := i;
                b[tot] := j;
                v[i, j] := true;
                v[j, i] := true;
                l[tot] := x;
            end;
        end;
        readln;
    end;
    qsort(1, tot);
    kruskal;
    close(input); close(output);
end.
我的确很闲。。闲的没事非要写kruskal。。谁让我喜欢呢。。


 

posted @ 2009-01-04 12:27  jesonpeng  阅读(194)  评论(0编辑  收藏  举报