宋壬初吧 关注:25贴子:419
  • 1回复贴,共1
var i,j,k,l,m,n,p,q,r,s,t,v,a1,a2,a3,a4,a5,ans,krus:longint;
    road:array[0..300,0..300] of longint;
    lab:array[0..300,0..300] of longint;
    path:array[0..10000,1..3] of longint;
    can:array[0..10000,0..50] of boolean;
    f:array[0..50] of longint;
    mid:array[1..3] of longint;
    use:array[0..10000] of boolean;
    root:array[0..300] of longint;
    pd:boolean=true;
procedure qsort(x,y:longint);
var g,t,l,r:longint;
begin
  l:=x;r:=y;
  g:=path[(x+y) div 2,3];
  repeat
    while (path[l,3]<g) do inc(l);
    while (path[r,3]>g) do dec(r);
    if l<=r then
    begin
      mid:=path[l];path[l]:=path[r];path[r]:=mid;
      inc(l);dec(r);
    end;
  until l>r;
  if x<r then qsort(x,r);
  if l<y then qsort(l,y);
end;
function ff(x:longint):longint;
begin
  if root[x]=x then exit(x);
  root[x]:=ff(root[x]);
  ff:=root[x];
end;
procedure kruscal;
var g,t,l,r:longint;
begin
  for g:=1 to p do if use[g] then
    if ff(path[g,1])<>ff(path[g,2]) then
    begin
      krus:=krus+path[g,3];
      root[root[path[g,1]]]:=root[path[g,2]];
    end;
end;
begin
 assign(input,'sango.in');
 reset(input);
 assign(output,'sango.out');
 rewrite(output);
   read(n,m,t,v,k);
   fillchar(road,sizeof(road),255);
   for i:=1 to m do
   begin
     read(l,r,s);
     road[l,r]:=s;
     road[r,l]:=s;
   end;
   p:=0;
   for i:=1 to n-1 do
     for j:=i+1 to n do
       if road[i,j]>-1 then
       begin
         inc(p);
         path[p,1]:=i;path[p,2]:=j;
         path[p,3]:=road[i,j];



1楼2009-10-28 17:05回复
           end;
      qsort(1,p);
      for i:=1 to p do
      begin
        lab[path[i,1],path[i,2]]:=i;
        lab[path[i,2],path[i,1]]:=i;
      end;
      fillchar(can,sizeof(can),true);
      readln(q);
      for i:=1 to q do
      begin
        read(a1,a2,a3,a4);
        for j:=a3 to a4 do can[lab[a1,a2],j]:=false;
      end;
      for i:=1 to t do f[i]:=1000000000;
      f[0]:=0;
      for i:=1 to t do
      begin
        fillchar(use,sizeof(use),true);
        for j:=i downto 1 do
        begin
          for l:=1 to p do if not can[l,j] then use[l]:=false;
          for l:=1 to n do root[l]:=l;
          krus:=0;
          kruscal;
          pd:=true;
          for l:=1 to n-1 do if ff(l)<>ff(l+1) then
          begin
            pd:=false;
            break;
          end;
          if pd then
          begin
            krus:=v*krus*(i-j+1)+k;
            if f[j-1]+krus<f[i] then f[i]:=f[j-1]+krus;
          end;
        end;
      end;
      writeln(f[t]);
     close(output);
    end.
    


    2楼2009-10-28 17:05
    回复