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