首页 > 学院 > 开发设计 > 正文

洛谷P1629 邮递员送信

2019-11-06 07:56:07
字体:
来源:转载
供稿:网友

题目描述

在一个城市中,有n个要送快递的地点,有m条单向通道,每次只能带走一个快递,出发点是1,每送一个快递要返回初始点。

样例输入

5 102 3 51 5 53 5 61 2 81 3 85 3 44 1 84 5 33 5 65 4 2

样例输出

83

思路

O(2n^2)先统计从1到各个点的最短路径,在把每一条路方向翻转,再做一次Dijkstra。var d:array[1..10000] of longint; a,b:array[1..1000,1..1000] of longint; mark:array[1..10000] of boolean; n,t,c,i:longint;PRocedure dij(v0:longint);var j,u,min:longint;begin fillchar(mark,sizeof(mark),false); mark[v0]:=true; for i:=1 to n do d[i]:=a[v0,i]; repeat u:=0;min:=maxint; for i:=1 to n do if (not mark[i])and(d[i]<min) then begin u:=i; min:=d[i]; end; if u<>0 then begin mark[u]:=true; for i:=1 to n do if (not mark[i])and(d[u]+a[u,i]<d[i])then begin d[i]:=d[u]+a[u,i]; end; end; until u=0;end;procedure dij2(v0:longint);var j,u,min:longint;begin fillchar(mark,sizeof(mark),false); mark[v0]:=true; for i:=1 to n do d[i]:=b[v0,i]; repeat u:=0;min:=maxint; for i:=1 to n do if (not mark[i])and(d[i]<min) then begin u:=i; min:=d[i]; end; if u<>0 then begin mark[u]:=true; for i:=1 to n do if (not mark[i])and(d[u]+b[u,i]<d[i])then begin d[i]:=d[u]+b[u,i]; end; end; until u=0;end;procedure init;var x,y,z:longint;begin readln(n,t); for i:=1 to t do begin readln(x,y,z); if z<a[x,y] then a[x,y]:=z; if z<b[y,x] then b[y,x]:=z; end;end;begin fillchar(a,sizeof(a),$7f); fillchar(b,sizeof(b),$7f); init; dij(1); for i:=2 to n do c:=c+d[i]; fillchar(d,sizeof(d),0); dij2(1); for i:=2 to n do c:=c+d[i]; writeln(c);end.
上一篇:斐波那契数列

下一篇:Set源码解析

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表