道路網(最短路問題)

2021-07-24 13:33:48 字數 2839 閱讀 3831

道路網

(map.pas/c/cpp)

【題目描述】

c國的道路網路由若干條雙向線路組成。每條線路途經一些城市(可能會經過多次同一

城市),位於線路上的兩個城市a,b通過i號線路互相抵達的費用為 w[i][a] + w[i][b]。現在有若干個詢問,詢問兩城市互相到達的最小費用。

【輸入資料】

第一行為城市數n與線路數m。

以下m行每行描述一條線路:

第乙個正整數l[i]為i號線路途經的城市數,接下來2*l[i]個正整數,每兩個數描述乙個城市,依次表示途經的城市j,費用w[i][j];接下來若干行每行兩個正整數a,b表示詢問a,b之間的最小費用,最後以0 0結束。

【輸出資料】

對於每組詢問輸出一行。

若不存在路徑輸出 -1,否則輸出最小費用。

【樣例輸入】

4 2

3 1 1 2 1 3 3

3 1 2 2 1 4 2

1 2

3 4

2 4

0 0

【樣例輸出】

2 7

3 【資料範圍】

令t為詢問數

10%的資料滿足n≤10,m≤3,t≤3。

30%的資料滿足n,t≤100,m,l[i]≤15。

50%的資料滿足n≤1000,t≤100,m,l[i]≤50。

100%的資料滿足n≤100000,m≤300,t,l[i],w[i][j]≤2000。

本人蒟蒻一枚=_=,只用spfa寫出了五十分的,剩餘tle

有大神路過的話,教教我怎麼寫t_t

五十分**如下:

program df;

type point=^node;

node=record

date,ends:longint;

next:point;

end;

var i,j,n,m,x,y,z,k,t:longint;

path:array[0..200000] of point;

a,dis:array[0..200000] of longint;

tm:array[0..5000000] of longint;

b:array[0..200000] of boolean;

procedure com(x,y,z:longint);

var i:point;

begin

i:=path[x];

new(path[x]);

path[x]^.ends:=y;

path[x]^.date:=z;

path[x]^.next:=i;

end;

procedure init;

var i:longint;

begin

for i:=1 to n+m+1 do

begin

dis[i]:=maxlongint div 3;

b[i]:=false;

end;

end;

procedure spfa(x:longint);

var i:point;

h,t,y,u:longint;

begin

init;

h:=0; t:=1; dis[x]:=0; tm[1]:=x; b[x]:=true;

repeat

inc(h);

u:=tm[h];

b[u]:=false;

i:=path[u];

while i<>nil do

begin

y:=i^.ends;

if dis[y]>dis[u]+i^.date then

begin

dis[y]:=dis[u]+i^.date;

if not b[y] then

begin

inc(t);

tm[t]:=y;

b[y]:=true;

end;

end;

i:=i^.next;

end;

until h=t;

end;

begin

assign(input,』map.in』);

reset(input);

assign(output,』map.out』);

rewrite(output);

readln(n,m);

for i:=1 to m do

begin

read(x);

for j:=1 to x do

begin

read(y,z);

com(i+n,y,z); //將每個地鐵線當作乙個點雙向建邊(可模擬為差分約束中的超級源點,跑最短路即可,還不懂的話,就當地鐵是乙個點好了,地鐵能通到各個點)

com(y,i+n,z);

end;

readln;

end;

dis[0]:=maxlongint div 3;

readln(x,y);

while (x<>0) and (y<>0) do

begin

spfa(x);

if dis[y]<>dis[0] then

writeln(dis[y])

else writeln(-1);

readln(x,y);

end;

close(input);

close(output);

end.

中國範圍2023年道路網資料分享

道路網資料 自openstreetmap osm 資料主要由公戶共享而成。osm是一款由網路大眾共同打造的免費開源 可編輯的地圖服務。openstreetmap它是利用公眾集體的力量和無償的貢獻來改善地圖相關的地理資料。osm是非營利性的,它將資料回饋給社群重新用於其它的產品與服務。而其他地圖則是將...

2825 GDOI2012 可靠道路網路

a 國需要發展他們的道路建設,他們需要乙個可靠的道路網路,使得任意一條道路癱瘓,整個國家仍然連通。作為 a 國的道路工程師,給你當前 a 國的道路圖,你需要計算至少需要新建設多少條道路才能使得此道路網路是可靠的,並任意給出一種可行方案。約定 a 國有 n 個城市組成,當前有 m 條雙向道路,其中兩個...

zoj 2760 最短路 網路流

題意 求乙個有向圖起點到終點的邊不相交的最短路徑的條數。思路 曾經乙個求最短路的類似,這題你找出來所有的最短路所包含的邊就可以,然後跑一邊網路流即可 include using namespace std const int maxn 400 const int maxm 160000 const ...