邻接表Spfa(Pascal版)

 1 const maxn=100;
 2 type
 3         point=^node;
 4         node=record
 5                 g,w:longint;
 6                 next:point;
 7         end;
 8 var
 9         i,j,k,l,m,n,s,t:longint;
10         a:array[0..maxn] of point;
11         b,c:array[0..maxn] of longint;
12         d:array[0..maxn] of boolean;
13 procedure add(x,y,z:longint);
14         var p:point;
15         begin
16                 new(p);p^.g:=y;p^.w:=z;
17                 p^.next:=a[x];a[x]:=p;
18         end;
19 procedure spfa(x:longint);
20         var f,r:longint;p:point;
21         begin
22                 fillchar(d,sizeof(d),false);d[x]:=true;
23                 fillchar(c,sizeof(c),0);
24                 f:=1;r:=2;b[f]:=x;
25                 while f<r do
26                         begin
27                                 p:=a[b[f]];
28                                 while p<>nil do
29                                         begin
30                                                 if (c[p^.g]=0) or (c[p^.g]>c[b[f]]+p^.w) then
31                                                         begin
32                                                                 c[p^.g]:=c[b[f]]+p^.w;
33                                                                 if d[p^.g]=false then
34                                                                         begin
35                                                                                 d[p^.g]:=true;b[r]:=p^.g;
36                                                                                 if r=maxn then r:=1 else inc(r);
37                                                                         end;
38                                                         end;
39                                                 p:=p^.next;
40                                         end;
41                                 d[b[f]]:=false;
42                                 if f=maxn then f:=1 else inc(f);
43                         end;
44         end;
45 begin
46         readln(n,m,s,t);
47         for i:=1 to n do a[i]:=nil;
48         for i:=1 to m do
49                 begin
50                         readln(j,k,l);
51                         add(j,k,l);add(k,j,l);
52                 end;
53         spfa(s);writeln(c[t]);
54 end.
时间: 2024-10-25 17:02:27

邻接表Spfa(Pascal版)的相关文章

POJ 1511 Invitation Cards 邻接表 spfa算法

原题: http://poj.org/problem?id=1511 题目大意: 单向图,需要从点1到每个点去一次,去了马上回来,再去下一个点,求往返路径和. 如果只有100个点,跑一遍floyd就可以了,这里有10w个点,不行. 朴素的dijkstra是N^2的复杂度,这里要超时. 所以这里我们用spfa这种接近2N的算法. 由于二维数组空间不够,所以只能用vector或者邻接表,因为vector的适合经常修改,本身是链表结构,每次插入数据都会消耗时间来申请内存并和前面建立联系,虽然可以支持下

SPFA&amp;邻接表 PASCAL

题目来自CODE[VS]-->热浪 1557 热浪 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 题目描述 Description 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦. FJ已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线.

POJ--3268--Silver Cow Party【SPFA+邻接表】

题意:一些牛要去某一点参加聚会,然后再回到自己家,路是单向的,问花费时间最多的那头牛最少需要花费多长时间. 思路:从聚会地点返回,相当于是从某一点到其他各个点的最短路径.从牛的家中走到聚会地点,可以把路径反过来变成从聚会地点到各个点的最短路径,两个最短路径值加起来就是每头牛所花费的最小时间,找出最大的即可. 我用了两个邻接表存路径,其实这道题用邻接矩阵存更好做,矩阵横纵坐标翻转就把路径反转了,我用SPFA写想练练手,一直都不会手写SPFA,做几道题找找感觉. AC居然用时0MS.. #inclu

HDU 2544 最短路 SPFA 邻接表 模板

Problem Description 在每年的校赛里,全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以如今他们想要寻找最短的从商店到赛场的路线,你能够帮助他们吗? Input 输入包含多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表示输入结束.接下来M行,每行

poj1511——Invitation Cards(SPFA+邻接表)

Description In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They want to propagate theater and, most of all, Antique Comedies. They have printed invitation cards with all

poj 1511 Invitation Cards (spfa+邻接表)

Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 19527   Accepted: 6375 Description In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They wan

The Postal Worker Rings Once(UVA 117)最短路径—SPFA算法+邻接表

The Postal Worker Rings Once From:UVA, 117 Time Limit: 3000 MS Background Graph algorithms form a very important part of computer science and have a lineage that goes back at least to Euler and the famous Seven Bridges of K?nigsberg problem. Many opt

ACM/ICPC 之 最短路-SPFA+正逆邻接表(POJ1511(ZOJ2008))

求单源最短路到其余各点,然后返回源点的总最短路长,以构造邻接表的方法不同分为两种解法. POJ1511(ZOJ2008)-Invitation Cards 改变构造邻接表的方法后,分为两种解法 解法一: 1 //POJ1511-ZOJ2008 2 //Time:7766Ms Memory:99112K 3 //求从1处到各点后再返回1处的最短总路长 4 //需要构造邻接表和逆邻接表 5 //构造方法1:vector构造邻接表 6 //SPFA+邻接表 7 #include<iostream>

以邻接表作为存储结构的图的深度优先遍历和广度优先遍历(c++版)

一.图的存储 用邻接表法存储图,存储结构分为两部分,一部分为存储图的所有顶点的数组,另一部分为挂载在数组的每个元素后面的用来表示顶点的邻接点的链表. 1.存储顶点的结构单元为: class vnode { public: string nodename; bool visted;//进行图的遍历时用于标记图是否被访问过 node *next; vnode() { visted = false; next = NULL; } }; 链表的结构单元为: class node { public: st