SPFA&邻接表 PASCAL

题目来自CODE[VS]-->热浪

1557 热浪

时间限制: 1 s

空间限制: 256000 KB

题目等级 : 钻石

题目描述 Description

德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。Farmer John此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦。

FJ已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线。这些路线包括起始点和终点先一共经过T (1 <= T <= 2,500)个城镇,方便地标号為1到T。除了起点和终点外地每个城镇由两条双向道路连向至少两个其它地城镇。每条道路有一个通过费用(包括油费,过路费等等)。

给定一个地图,包含C (1 <= C <= 6,200)条直接连接2个城镇的道路。每条道路由道路的起点Rs,终点Re (1 <= Rs <= T; 1 <= Re <= T),和花费(1 <= Ci <= 1,000)组成。求从起始的城镇Ts (1 <= Ts <= T)到终点的城镇Te(1 <= Te <= T)最小的总费用。

输入描述 Input Description

第一行: 4个由空格隔开的整数: T, C, Ts, Te

第2到第C+1行: 第i+1行描述第i条道路。有3个由空格隔开的整数: Rs, Re和Ci

输出描述 Output Description

一个单独的整数表示从Ts到Te的最小总费用。数据保证至少存在一条道路。

样例输入 Sample Input

7 11 5 4

2 4 2

1 4 3

7 2 2

3 4 3

5 7 5

7 3 3

6 1 1

6 3 4

2 4 3

5 6 3

7 2 1

样例输出 Sample Output

7

数据范围及提示 Data Size & Hint

5->6->1->4 (3 + 1 + 3)

var
    n,m,i,t,w,d,s,e,x,y,z:longint;
    next,a,v,c:array[1..101000]of longint;
    head,f:array[1..10010]of longint;
    u:array[1..10010]of boolean;

procedure init;
    begin
        readln(n,m,s,e);        //读入
        for i:=1 to m do
            begin
                readln(x,y,z);
                next[2*i-1]:=head[x];        //next记录下一个与x相连的边对应的i
                head[x]:=i*2-1;        //当前x对应的i
                a[2*i-1]:=y;        //记录边
                v[2*i-1]:=z;        //记录边权
                    next[2*i]:=head[y];
                    head[y]:=2*i;
                    a[2*i]:=x;
                    v[2*i]:=z;            //注意双向道路
            end;
        for i:=1 to n do
            f[i]:=maxlongint;        //初始化
        f[s]:=0;
    end;

procedure spfa;            //SPFA
    begin
        t:=1; w:=1;        //t:头指针; w:尾指针;
        c[t]:=s; u[s]:=true;    //c:队列; u:记录是否在队列中
        while t<>w+1 do
            begin
                d:=head[c[t]];
                while d<>0 do
                    begin
                        if f[c[t]]+v[d]<f[a[d]] then
                            begin
                                f[a[d]]:=f[c[t]]+v[d];    //对a[d]的距离进行更新
                                if not u[a[d]] then        //当a[d]不在队列中时
                                    begin
                                        inc(w);
                                        c[w]:=a[d];
                                        u[a[d]]:=true;
                                    end;
                            end;
                        d:=next[d];        //用邻接表查找下一个与c[t]相邻的点
                    end;
                u[c[t]]:=false;        //将c[t]出队
                inc(t);        //头指针后移一位
            end;
    end;

procedure output;
    begin
        writeln(f[e]);
    end;

begin
    init;
    spfa;
    output;
end.
时间: 2024-10-06 01:07:31

SPFA&邻接表 PASCAL的相关文章

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

POJ 3259 Wormholes(SPFA+邻接表)

( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<queue> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int INF=10e7; const int MAXN=510; int f,n,m,w,s,e,t; int lc[MAXN],cntNode

POJ 1511 SPFA+邻接表

#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> using namespace std; #define INF 0xffffffff #define maxn 1000005 struct Edge { int w, e; }; int UseCount[m

cug1697 spfa+邻接表

题目大意:赤壁决战,曹操在有利形势下,轻敌自负,指挥失误,终致战败.孙权.刘备在强敌进逼关头,结盟抗战,扬水战之长,巧用火攻,终以弱胜强.赤壁之战结束之后魏蜀吴三国决定握手求和,但是因为之前四处交战,把道路全部毁坏了,现在需要重新修路使得三国的国都能够连通.诸葛亮是这个项目的负责人,但是他太聪明了,对于这种题目都懒得思考了,于是就交给你了. 思路:因为要求三个和城市之间的最短路,最短路一定是经过某一点到三点距离和最小,不是一个城市到其他两个城市的最短路.所以3遍spfa把三个城市的最短路跑出来,

uva 11374 Airport Express(spfa 邻接表+队列)

Problem D: Airport Express In a small city called Iokh, a train service, Airport-Express, takes residents to the airport more quickly than other transports. There are two types of trains in Airport-Express, the Economy-Xpress and theCommercial-Xpress

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>