| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
求助啊啊,我已经不想过什么圣诞节了啊调了我4个小时,我真的试了很多很多的数据,可是为什么老是WA呢
???
我代码,好心人,帮帮忙吧。。。感激不尽啊啊啊
Dijsktra + Heap
哪里有错误呢?
program Big_Christmax_Tree ;
const maxn = 120000 ;
infinity = 100000000000000 ;
type link = ^node ;
node = record d : int64; w : int64; next : link ; end ;
heaptype = record dist : int64; pointer : int64; end ;
element = array[0..1000] of int64 ;
var vertex : array[1..maxn] of link ;
weight : array[1..maxn] of int64;
h : array[1..maxn] of heaptype ;
a : array[1..maxn] of int64;
chosen : array[1..maxn] of boolean ;
ans , n , m , num , testcase : int64;
procedure go_up( s , t : longint) ;
var ti , tj : int64; x : heaptype ;
begin
if s >= t then exit ;
tj := t ; ti := tj shr 1 ; x := h[tj] ;
while ti >= s do
if x.dist < h[ti].dist
then begin
a[h[ti].pointer] := tj ;
h[tj] := h[ti] ; tj := ti ; ti := tj shr 1 ;
end
else break ;
h[tj] := x ; a[x.pointer] := tj ;
end ;
procedure go_down( s , t : int64) ;
var ti , tj : int64; x : heaptype ;
begin
if s >= t then exit ;
ti := s ; tj := ti shl 1 ; x := h[ti] ;
while tj <= t do begin
if ( tj < t ) and ( h[tj+1].dist < h[tj].dist ) then inc( tj ) ;
if x.dist > h[tj].dist
then begin
a[h[tj].pointer] := ti ;
h[ti] := h[tj]; ti := tj ; tj := ti shl 1 ;
end
else break ;
end ;
h[ti] := x ; a[x.pointer] := ti ;
end ;
procedure enter ;
var i : longint ; x , y , k : int64; p : link ;
begin
fillchar( vertex , sizeof( vertex ) , 0 ) ; fillchar( chosen , sizeof( chosen ) , 0 ) ;
readln( n , m ) ;
for i := 1 to n do read( weight[i] ) ;
for i := 1 to m do begin
readln( x , y , k ) ;
if x <> y
then begin
new( p ) ; p^.d := y ; p^.w := k ; p^.next := vertex[x] ; vertex[x] := p ;
new( p ) ; p^.d := x ; p^.w := k ; p^.next := vertex[y] ; vertex[y] := p ;
end ;
end ;
for i := 1 to n - 1 do begin
h[i].dist := infinity ; h[i].pointer := i + 1 ; a[i + 1] := i ;
end ;
h[n].dist := 0 ; h[n].pointer := 1 ; a[1] := n ; chosen[1] := true ; num := n - 1 ;
p := vertex[1] ;
while p <> nil do begin
if p^.w < h[a[p^.d]].dist
then begin
h[a[p^.d]].dist := p^.w ;
go_up( 1 , a[p^.w] ) ;
end ;
p := p^.next ;
end ;
end ;
procedure solve ;
var i : longint ; p : link ; d : heaptype ;
begin
for i := 1 to n-1 do begin
p := vertex[h[1].pointer] ;
while p <> nil do begin
if not chosen[p^.d] and ( h[1].dist + p^.w < h[a[p^.d]].dist )
then begin
h[a[p^.d]].dist := h[1].dist + p^.w ;
go_up( 1 , a[p^.d] ) ;
end ;
p := p^.next ;
end ;
chosen[h[1].pointer] := true ; a[h[1].pointer] := num ; a[h[num].pointer] := 1 ;
d := h[1] ; h[1] := h[num] ; h[num] := d ; dec( num ) ;
go_down( 1 , num ) ;
end ;
end ;
procedure print ;
var i , j : longint ; st : string ;
begin
ans := 0 ;
for i := 1 to n do
if h[a[i]].dist>=infinity
then begin
ans := -1 ; break ;
end
else
ans := ans + weight[i] * h[a[i]].dist ;
if ans = -1
then writeln('No Answer')
else writeln( ans ) ;
end ;
begin
assign(input,'t3013.in') ; reset(input) ; assign(output,'t3013.out') ; rewrite(output) ;
readln( testcase ) ;
while testcase > 0 do begin
dec( testcase ) ;
enter ;
solve ;
print ;
end ;
close(input) ; close(output) ;
end .
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator