演算法提高 道路和航路

2022-06-05 04:54:11 字數 2044 閱讀 5442

演算法提高 道路和航路  

時間限制:

1.0s 記憶體限制:256

.0mb

提交此題 錦囊1 錦囊2

問題描述

農夫約翰正在針對乙個新區域的牛奶配送合同進行研究。他打算分發牛奶到t個城鎮(標號為1..t),這些城鎮通過r條標號為(

1..r)的道路和p條標號為(1

..p)的航路相連。

每一條公路i或者航路i表示成連線城鎮ai(

1<=a_i<=t)和bi(1

<=bi<=t)代價為ci。每一條公路,ci的範圍為0<=ci<=10,000;由於奇怪的運營策略,每一條航路的ci可能為負的,也就是-10,000

<=ci<=10,000

。每一條公路都是雙向的,正向和反向的花費是一樣的,都是非負的。

每一條航路都根據輸入的ai和bi進行從ai->bi的單向通行。實際上,如果現在有一條航路是從ai到bi的話,那麼意味著肯定沒有通行方案從bi回到ai。

農夫約翰想把他那優良的牛奶從配送中心送到各個城鎮,當然希望代價越小越好,你可以幫助他嘛?配送中心位於城鎮s中(

1<=s<=t)。

輸入格式

輸入的第一行包含四個用空格隔開的整數t,r,p,s。

接下來r行,描述公路資訊,每行包含三個整數,分別表示ai,bi和ci。

接下來p行,描述航路資訊,每行包含三個整數,分別表示ai,bi和ci。

輸出格式

輸出t行,分別表示從城鎮s到每個城市的最小花費,如果到不了的話輸出no path。

樣例輸入63

3412

5345

56103

5 -100

46 -100

13 -10

樣例輸出

no path

no path50

-95-100

資料規模與約定

對於20%的資料,t<=100,r<=500,p<=500

;對於30%的資料,r<=1000,r<=10000,p<=3000

;對於100%的資料,1

<=t<=25000,1

<=r<=50000,1

<=p<=50000。

只得了85分,儘管剛學習了如何用輸入輸出外掛程式,但還是不行,有三組資料超時,我用的bellman方法,看來還是得學spfa演算法。

#include #include 

#include

#include

#include

#include

#define max_v 650005

#define max_e 1000005

#define inf 0x3f3f3f3f

using

namespace

std;

struct edge;

edge ee[max_e];

//儲存每條邊的資訊

long

long

int d[max_v];//

表示s到每個頂點的最短距離

int v,e;//

頂點數和邊數

intr,p,s;

template

inline

bool scan_d(t &ret)

inline

void

out(long

long

intx)

bool bellman(int

s) }

j++;

if(!update) return

true

;

if(j==v) return

false;//

當進行第v次迴圈時,說明存在負圈}}

intmain()

else

}if(bellman(s-1

))else

}else}}

//fclose(stdin);

//fclose(stdout);

return0;

}/**/

演算法提高 道路和航路

演算法提高 道路和航路 時間限制 1.0s 記憶體限制 256.0mb 提交此題 錦囊1 錦囊2 問題描述 農夫約翰正在針對乙個新區域的牛奶配送合同進行研究。他打算分發牛奶到t個城鎮 標號為1.t 這些城鎮通過r條標號為 1.r 的道路和p條標號為 1.p 的航路相連。每一條公路i或者航路i表示成連...

演算法提高 道路和航路

演算法提高 道路和航路 演算法提高 道路和航路 時間限制 1.0s 記憶體限制 256.0mb 問題描述 農夫約翰正在針對乙個新區域的牛奶配送合同進行研究。他打算分發牛奶到t個城鎮 標號為1.t 這些城鎮通過r條標號為 1.r 的道路和p條標號為 1.p 的航路相連。每一條公路i或者航路i表示成連線...

道路和航路

演算法提高 道路和航路 時間限制 1.0s 記憶體限制 256.0mb 問題描述 農夫約翰正在針對乙個新區域的牛奶配送合同進行研究。他打算分發牛奶到t個城鎮 標號為1.t 這些城鎮通過r條標號為 1.r 的道路和p條標號為 1.p 的航路相連。每一條公路i或者航路i表示成連線城鎮ai 1 a i t...