道路和航路

2021-08-03 14:06:57 字數 2238 閱讀 1064

【題目描述】

農夫約翰正在針對乙個新區域的牛奶配送合同進行研究。他打算分發牛奶到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。

【樣例輸入】

6 3 3 4

1 2 5

3 4 5

5 6 10

3 5 -100

4 6 -100

1 3 -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。

【分析】

先上spfa的**:

#include

using

namespace

std;

#define maxn 200000

#define inf 1<<30

struct edgea[maxn];

int m=1,d[25005],head[25005],vis[25005],t,r,p,s;

inline

int read()

while (ch>='0'&&ch<='9')

return x*p;

}inline

void write(int x);

int i=0;

if (x<0) putchar('-'),x=-x;

do while (x/=10);

while (i) putchar(ch[i--]);

putchar('\n');

}int main()

for(int i=1;i<=p;i++)

vis[s]=1;

d[s]=0;

deque

q;q.push_front(s);

int sum=0,cnt=!;

while(!q.empty())

vis[u]=0;

sum-=dis[u],cnt--;

for(int i=head[u];i!=-1;i=a[i].next)}}

}for(int i=1;i<=t;i++)

if (d[i]==inf) printf("no path\n"); else write(d[i]);

}

然後我們想到了dijkstra。

眾:不是說dijkstra不能處理含有負權的圖嗎?

我:這題的圖比較特殊啊~

不知道各位有沒有思考為什麼要讀入r條公路和p條航路而不是直接讀入2r+p條有向的路呢?其實這就是和spfa模板題唯一的區別啊突破口。

暫時拋開單向邊不談,我們將無向邊連成的各點分成很多塊狀結構,然後在塊與塊之間用單向邊相連。

然後可以用縮點法將塊縮成點,於是現在的圖變成了乙個dag。

然後就可以無腦dp咯~~

至於具體做法,可以用並查集維護一下連成的塊,然後用dijkstra求出每個塊內部的最短路(從起點開始)。對於第i個塊,當所有存在有向邊指向該塊的塊內部的最短路已經求好的時候,再求第i個塊的最短路。

可以使用deque(stl裡的雙向佇列)優化程式。

道路和航路

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

道路和航路

農夫約翰正在針對乙個新區域的牛奶配送合同進行研究。他打算分發牛奶到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...

演算法提高 道路和航路

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