道路和航路

2021-09-11 01:22:40 字數 1711 閱讀 4848

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

首先看到了負值,就想spfa,但是一直沒有用過。所以今天學習了一波

spfa就是把起點入隊,然後去鬆弛相連的邊,如果可以鬆弛且相連沒有入隊,就入隊。直到隊列為空

注意 如果出隊,就及時取消標記

如果乙個點,入隊次數  > n 就說明有負環

但是這道題需要spfa優化

不用普通的佇列,而是雙端佇列。如果鬆弛點的dis值小於隊首就加入隊首,否則加入隊尾。

回憶一下前向星。

edge[i].to 表示第i條邊的終點

edge[i].next 表示與第i條邊同起點的邊

head[i] 表示以i為起點的邊的位置。

1 #include2

const

int inf=0x3f3f3f3f;3

using

namespace

std;45

struct

nodeedge[150010];8

int dis[25010],cnt,head[25010],vis[25010],c[25010];9

10void add(int u,int v,int

w) 16

17void spfa(int st,int

n) 23 dis[st]=0

;24 vis[st]=1

;25 dequeq;

26q.push_front(st);

27while(!q.empty()) else

if(!vis[edge[i].to]) else

q.push_back(edge[i].to);

43 vis[edge[i].to]=1;44

}45}46

}47}48

}495051

intmain()

62for(int i=0;i)

66spfa(s,t);

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

72return0;

73 }

posted @

2019-02-16 16:51

acmerszl 閱讀(

...)

編輯收藏

道路和航路

演算法提高 道路和航路 時間限制 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 1...

演算法提高 道路和航路

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