生产

【题目描述】

工厂为了生产一种复杂的产品,给各个生产部门制定了详细的生产计划。那么,就经常会有生产部门要把产品送到另一个生产部门作为原料。这是一个注重产品质量的工厂,所以每当有产品要从A部门运到B部门时,都要先从A部门送到质量检验处,检验合格后再从质量检验处运到B部门。

有些部门之间有传送带连接,厂长想知道每次将产品从一个部门运送到另一个部门最少需要多长时间。

【输入格式】

第一行两个整数n、m,n表示部门数量,m表示传送带数量。出于方便,1号部门是质量检验处。

接下来m行,每行三个整数u、v、w,表示有一条从u部门到v部门的传送带,传送过去需要w个单位时间。注意传送带是单向的。

接下来一个整数q,表示有q次运送。

接下来q行,每行两个数a、b,表示这一次要将产品从a部门运送到b部门。

【输出格式】

输出q行,每行一个整数,表示这次运送最少需要的时间。若没有传送方案,输出-1。

【样例输入】

5 5

1 2 3

1 3 5

4 1 7

5 4 1

5 3 1

3

4 2

5 3

2 3

【样例输出】

10

13

-1

【数据规模与约定】

30%的数据,n≤100,m≤500,w=1

60%的数据,n≤100,m≤5000

另20%的数据,q=1

100%的数据,2≤n≤3000,m≤100000,2≤a,b≤n,

q≤100000,1≤u,v≤n,1≤w≤10000

有些部门之间可能有多条传送带。

工厂的员工都非常尽职尽责,他们的认真和热情决定了产品的完美,所以不必考虑产品不合格的情况。

【解题思路】

其实乍一看这个题并不是什么难题,但是(传说中的转折)他只给了24M内存,根本不够用啊!!!这个时候链表大法就上来了(其实我也不知道我做的是不是链表,总之能用),把边用链表储存,然后以一为起点跑两遍单源最短路,求值就好了

 1 program t3;
 2 var u,u1,v,v1,w,w1,head,head1,next,next1,d,d1:array[1..100000] of longint;
 3     vis,vis1:array[1..100001] of boolean;
 4     n,q,m:Longint;
 5 procedure init;
 6 var i:longint;
 7 begin
 8     read(n,m);
 9     for i:=1 to m do
10     begin
11         read(u[i],v[i],w[i]);
12         next[i]:=head[u[i]];//由边指向边
13         head[u[i]]:=i;//由点指向边
14         u1[i]:=v[i];//建一张反图
15         v1[i]:=u[i];
16         next1[i]:=head1[u1[i]];
17         head1[u1[i]]:=i;
18     end;
19 end;
20 
21 procedure dij;//迪杰斯特拉
22 var i,min,minn,l,j:longint;
23 begin
24     for i:=1 to n do
25     begin
26         d1[i]:=1000000;
27         d[i]:=1000000;
28     end;
29     d[1]:=0;
30 
31     for j:=1 to n do
32     begin
33         min:=1000000;
34         for i:=1 to n do
35         if (d[i]<min) and(not vis[i]) then
36         begin
37             min:=d[i];
38             minn:=i;
39         end;
40         l:=head[minn];
41         vis[minn]:=true;
42         while l<>0 do
43         begin
44             if d[v[l]]>min+w[l] then
45             d[v[l]]:=min+w[l];
46             l:=next[l];
47         end;
48     end;
49 
50     d1[1]:=0;
51 
52     for j:=1 to n do
53     begin
54          min:=1000000;
55         for i:=1 to n do
56         if (d1[i]<min) and(not vis1[i]) then
57         begin
58             min:=d1[i];
59             minn:=i;
60         end;
61         l:=head1[minn];
62         vis1[minn]:=true;
63         while l<>0 do
64         begin
65             if d1[v1[l]]>min+w[l] then
66             d1[v1[l]]:=min+w[l];
67             l:=next1[l];
68         end;
69      end;
70 end;
71 
72 procedure print;
73 var a,b,i:Longint;
74 begin
75     read(q);
76     for i:=1 to q do
77     begin
78         read(a,b);
79         if d[b]+d1[a]<1000000 then writeln(d[b]+d1[a]) else writeln('-1');
80     end;
81 end;
82 
83 begin
84     assign(input,'production.in');
85   assign(output,'production.out');
86   reset(input);
87   rewrite(output);
88     init;
89     dij;
90     print;
91      close(input);
92   close(output);
93 end.
原文地址:https://www.cnblogs.com/wuminyan/p/4743991.html