比赛 20120709 评测结果 AAAAAAAAAAAA
题目名称 聪明的推销员 最终得分 100
用户昵称 zhangchi 运行时间 0.444 s
代码语言 Pascal 内存使用 8.88 MiB
提交时间 2012-07-09 11:32:14
显示代码纯文本
type
  node=record
         v,next:longint;
       end;
var
  i,j,k,n,p,r,ans,tot,temp,x,y,tail:longint;
  q:array[1..3000] of boolean;
  vis:array[1..3000] of boolean;
  b:array[1..3000,1..3000] of boolean;
  which,cost:array[1..3000] of longint;
  f:array[1..3000] of longint;
  a:array[1..10000] of node;
  d:array[1..3000] of longint;
  exist:array[1..3000] of boolean;
  procedure insert(x,y:longint);
  begin
    inc(tot);
    a[tot].next:=f[x];
    f[x]:=tot;
    a[tot].v:=y;
  end;
  procedure floodfill(x:longint);
  var
    t:longint;
  begin
    q[x]:=true;
    vis[x]:=true;
    b[which[i],x]:=true;
    t:=f[x];
    while t<>0 do
      begin
        if q[a[t].v]=false then
          floodfill(a[t].v);
        t:=a[t].next;
      end;
  end;
begin
  assign(input,'salenet.in'); reset(input);
  assign(output,'salenet.out'); rewrite(output);
  readln(n);
  readln(p);
  for i:=1 to p do
    begin
      read(which[i]);
      readln(cost[i]);
    end;
  readln(r);
  for i:=1 to r do
    begin
      readln(x,y);
      insert(x,y);
    end;
  for i:=1 to p do
    begin
      fillchar(q,sizeof(q),false);
      floodfill(which[i]);
    end;
  for i:=1 to n do
    if vis[i]=false then
      begin
        writeln('NO');
        writeln(i);
        close(input); close(output);
        halt;
      end;
  for i:=1 to p do
    begin
      inc(tail);
      d[tail]:=which[i];
      exist[tail]:=true;
      ans:=ans+cost[i];
      temp:=tail-1;
      for j:=1 to temp do
        if exist[j] then
          begin
		      if b[which[i],d[j]] and b[d[j],which[i]] then  
			     begin
		          if cost[tail]>cost[j] then 
		        		begin
			           exist[tail]:=false;
                    dec(ans,cost[tail]);
                    break; 
	            	end
		      	else
	      			begin
	            	  exist[j]:=false;
                    dec(ans,cost[j]);
	  	      	     continue;
			         end;
			     end;
            if b[which[i],d[j]] then
              begin
                exist[j]:=false;
                dec(ans,cost[j]);
			       continue;
              end;
            if b[d[j],which[i]] then
				  begin
                exist[tail]:=false;
                dec(ans,cost[tail]);
                break;
              end;
          end;
    end;
  writeln('YES');
  writeln(ans);
  close(input); close(output);
end.