[NOIP2009 最优贸易]

【题目】:最优贸易

【来源】:NOIP2009第三题

【关键字】:图论 最短路

//==================================================================================================

【分析】:其实就是求出前i个点最低买入价和最高卖出价,可以用动规求解:f[i]=min/max{f[i],f[j],data[i]}。在将这个方程转换一下,其实就是最短路径中的松弛操作。所以可以用spfa(dij+堆不行!)求解。

【小结】:我的代码里是最低买入价和最大盈利

//==================================================================================================

【代码】:

ContractedBlock.gif ExpandedBlockStart.gif View Code
 1 program Project1;
2 type
3 rec = record
4 y, n: longint;
5 end;
6 var
7 tot, n, m: longint;
8 data, link, max, min: array[0..100010] of longint;
9 q: array[0..500000] of longint;
10 e: array[0..500010] of rec;
11 procedure make(x, y: longint);
12 begin
13 inc(tot);s
14 e[tot].y := y;
15 e[tot].n := link[x];
16 link[x] := tot;
17 end;
18 procedure init;
19 var
20 i, x, y, z: longint;
21 begin
22 read(n,m);
23 for i := 1 to n do
24 begin
25 read(data[i]);
26 max[i] := -1;
27 min[i] := 30000;
28 end;
29 for i := 1 to m do
30 begin
31 read(x,y,z);
32 make(x,y);
33 if z = 2 then make(y,x);
34 end;
35 end;
36 function gmax(x, y: longint):longint;
37 begin
38 if x > y then exit(x) else exit(y);
39 end;
40 function gmin(x, y: longint):longint;
41 begin
42 if x < y then exit(x) else exit(y);
43 end;
44 procedure spfa;
45 var
46 t, h, ne: longint;
47 begin
48 t := 1;
49 h := 1;
50 q[1] := 1;
51 max[1] := 0;
52 min[1] := data[1];
53
54 while h <= t do
55 begin
56 ne := link[q[h]];
57 while ne <> 0 do
58 begin
59 if (gmin(min[q[h]],data[e[ne].y]) < min[e[ne].y]) or (gmax(max[q[h]],data[e[ne].y]-min[q[h]]) > max[e[ne].y]) then
60 begin
61 min[e[ne].y] := gmin(gmin(min[q[h]],data[e[ne].y]),min[e[ne].y]);
62 max[e[ne].y] := gmax(gmax(max[q[h]],data[e[ne].y]-min[q[h]]),max[e[ne].y]);
63 //if b[e[ne].y] then
64 begin
65 inc(t);
66 q[t] := e[ne].y;
67 end;
68 end;
69 ne := e[ne].n;
70 end;
71 inc(h);
72 end;
73 end;
74 begin
75 assign(input,'1.in');reset(input);
76 assign(output,'1.out');rewrite(output);
77 init;
78 spfa;
79 writeln(max[n]);
80 // read(n);
81 close(input);
82 close(output);
83 end.



转载于:https://www.cnblogs.com/procedure2012/archive/2011/10/20/2218415.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值