基于邻接表的最短路径算法C语言,怎么用邻接表实现图的最短路径(Pascal)

该博客介绍了一种基于SPFA(Shortest Path Faster Algorithm)算法的程序实现,用于解决图的最短路径问题。程序处理了两种类型的边,并在2009年NOIP第三题中得到应用。通过两个SPFA过程分别求解最小花费和最大收益,最后计算两者之差作为答案。
摘要由CSDN通过智能技术生成

满意答案

00e27ab806e4881f8254fe7ae8741834.png

笑鱼0837

2013.07.13

00e27ab806e4881f8254fe7ae8741834.png

采纳率:53%    等级:11

已帮助:9755人

不想说太多了....给你个链式前向心的SPFA的程序...基本上你只要知道这个就可以A很多题目了,题目是2009年NOIP的第三题。自己看看吧

const

maxn=100010;

maxm=1000010;

type

data=record

t,f,next:longint;

end;

var

n,m,ls:longint;

a,c,d,stack,v:array[0..maxn]of longint;

f:array[1..maxn]of boolean;

seg:array[1..maxm]of data;

procedure insert_e(s,t,f1,f2:longint);

begin

inc(ls);

seg[ls].t:=t;

seg[ls].f:=f1;

seg[ls].next:=a[s];

a[s]:=ls;

inc(ls);

seg[ls].t:=s;

seg[ls].f:=f2;

seg[ls].next:=a[t];

a[t]:=ls;

end;

procedure init;

var

i,j,k,l:longint;

begin

readln(n,m);

fillchar(a,sizeof(a),255);

ls:=0;

for i:=1 to n do read(v[i]);

for i:=1 to m do

begin

readln(j,k,l);

if l=1 then insert_e(j,k,1,2)

else insert_e(j,k,3,3);

end;

end;

function max(a,b:longint):longint;

begin

if a>b then exit(a) else exit(b);

end;

function min(a,b:longint):longint;

begin

if a

end;

procedure spfa1;

var

i,k,open,closed:longint;

begin

fillchar(c,sizeof(c),127);

fillchar(f,sizeof(f),0);

f[1]:=true;

open:=0;

closed:=1;

stack[1]:=1;

c[1]:=v[1];

while open

begin

inc(open);

k:=stack[open mod maxn];

f[k]:=false;

i:=a[k];

while i<>-1 do

begin

if (seg[i].f and 1=1)and(min(c[k],v[seg[i].t])

begin

c[seg[i].t]:=min(c[k],v[seg[i].t]);

if not f[seg[i].t] then

begin

f[seg[i].t]:=true;

inc(closed);

stack[closed mod maxn]:=seg[i].t;

end;

end;

i:=seg[i].next;

end;

end;

end;

procedure spfa2;

var

i,k,open,closed:longint;

begin

fillchar(d,sizeof(d),0);

fillchar(f,sizeof(f),0);

f[n]:=true;

open:=0;

closed:=1;

stack[1]:=n;

d[n]:=v[n];

while open

begin

inc(open);

k:=stack[open mod maxn];

f[k]:=false;

i:=a[k];

while i<>-1 do

begin

if (seg[i].f and 2=2)and(max(d[k],v[seg[i].t])>d[seg[i].t]) then

begin

d[seg[i].t]:=max(d[k],v[seg[i].t]);

if not f[seg[i].t] then

begin

f[seg[i].t]:=true;

inc(closed);

stack[closed mod maxn]:=seg[i].t;

end;

end;

i:=seg[i].next;

end;

end;

end;

procedure main;

var

i,ans:longint;

begin

spfa1;

spfa2;

ans:=0;

for i:=1 to n do

ans:=max(ans,d[i]-c[i]);

writeln(ans);

end;

begin

assign(input,'trade.in');

reset(input);

assign(output,'trade.out');

rewrite(output);

init;

main;

close(input);

close(output);

end.

03分享举报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值