由于yxy小朋友做了一些不该做的事,他被jzp关进了一个迷宫里。由于jzp最近比较忙,疏忽大意了一些,yxy可以在迷宫中任意走动。整个迷宫可以被看作是一个无向图。迷宫中有一些结点有传送点,可以让他逃离这个迷宫。jzp发明了一种机器人,可以监视迷宫中的道路,被监视的道路yxy不能通过,我们简单的认为监视一条道路的代价即为这条道路的长度。现在jzp正在忙,请你编一个程序算出使yxy无法逃离迷宫的最小监控总代价。(yxy一开始在1号结点)
第1行:两个自然数n和e,分别表示迷宫的节点数和边数。
第2至e+1行:每行三个自然数a、b和w,表示a和b之间有一条道路,长度为w。
第e+2行:一个自然数m,表示有传送点结点的个数。
第e+3行:m个自然数,表示有传送点的结点。
一个自然数,表示最小监视总代价。
</pre><pre name="code" class="delphi">
program wangluoliu; var ans,f,i,j,n,e,a1,b1,w,m,top,tail,u,v,t,c:longint; cap,flow:array[1..101,1..101]of longint; a,p:array[1..101]of longint; b:array[1..100001]of longint; function min(a,b:longint):longint; begin if a<b then min:=a else min:=b; end; begin read(n,e); for i:=1 to n do for j:=1 to n do cap[i,j]:=-1; for i:=1 to e do begin read(a1,b1,w); cap[a1,b1]:=w; cap[b1,a1]:=w; end; read(m); for i:=1 to m do begin read(c); cap[c,n+1]:=maxlongint; cap[n+1,c]:=maxlongint;//超级汇点 end; //最大流最小割算法 f:=0;t:=n+1; fillchar(flow,sizeof(flow),0); while true do begin fillchar(a,sizeof(a),0); a[1]:=maxlongint; top:=1;tail:=1; b[top]:=1;//s repeat u:=b[top]; for v:=1 to n+1 do if (a[v]=0)and(cap[u,v]>flow[u,v]) then begin p[v]:=u; tail:=tail+1; b[tail]:=v; a[v]:=min(a[u],cap[u,v]-flow[u,v]); end; top:=top+1; until top>tail; if a[t]=0 then break; u:=t; while u<>1 do begin flow[p[u],u]:=flow[p[u],u]+a[t]; flow[u,p[u]]:=flow[u,p[u]]-a[t]; u:=p[u]; end; f:=f+a[t]; end; for i:=1 to n+1 do if a[i]>0 then for j:=1 to n+1 do if (cap[i,j]>0)and(a[j]=0) then ans:=ans+cap[i,j]; writeln(ans); end.