城市的道路是雙向的,每條道路有固定的旅行時間以及需要支付的費用。路徑由連續的道路組成。總時間是各條道路旅行時間的和,總費用是各條道路所支付費用的總和。同樣的出發地和目的地,如果路徑a比路徑b所需時間少且費用低,那麼我們說路徑a比路徑b好。對於某條路徑,如果沒有其他路徑比它好,那麼該路徑被稱為最優雙調路徑。這樣的路徑可能不止一條,或者說根本不存在。
給出城市交通網的描述資訊,起始點和終點城市,求最優雙條路徑的條數。城市不超過100個,邊數不超過300,每條邊上的費用和時間都不超過100。
輸入描述
第一行給出有多少個點,多少條邊,開始點及結束點.
輸出描述
有多少條雙調路徑
樣例輸入
4 5 1 42 1 2 1
3 4 3 1
2 3 1 2
3 1 1 4
2 4 2 4
樣例輸出 sample output
2
本題用的一種巧妙的做法。顯然這題是一道單源最短路問題,用spfa或是dijkstra都是可以的。但是我們要進行spfa的是對於某個固定的花費下的所用的時間。也就是程式當中的dist[city][cost] = time這個在注釋裡有寫。因為費用最大是100,所以cost開到二維陣列開出來不會爆記憶體的!
本題有幾個要注意的小問題:(有些是我愚蠢的錯誤)
因為是無向邊edge陣列記得開2*maxm
有的變數名字注意一下哈:time叫t,target也叫t,那不是很愚蠢啊……
1 #include 2using
namespace
std;
3const
int maxn = 100 + 1;4
const
int maxm = 300 + 1;5
int n, m, s, t, edgecount = 0, mintime = 0x3f3f3f3f
, head[maxn];
6int dist[maxn][maxn*maxn];
7bool vis[maxn][maxn*maxn];
8struct
edge
9edge[maxm*2
];12
struct
node13;
16void insert(int u, int v, int w, int
t)17
;19 head[u] =edgecount;20}
21void
spfa()
22);
28 dist[s][0] = 0
;29 vis[s][0] = true;30
while (!q.empty())
31);47}
48}49}
50}51}
52int
main()
5363
spfa();
64int ans = 0;65
for (int i = 0; i <= maxn*n; i++)
6673 cout << ans <74return0;
75 }
檔案路徑 BOI2015
對於每個葉子節點問 是否能構造出一條從根節點出發以該節點為終點的長為 k 的路徑 設有乙個葉子節點 x 情況1根到 x 的路徑長等於 k 那顯然答案就是yes 情況2走了一次附加的有向邊使得路徑長為 k 考慮這條有向邊的終點在 由於走過這條有向邊之後還要從它的終點走到 x 所以有向邊的終點一定要是 ...
BOI2007 Sequence 序列問題
對於乙個給定的序列a1,an,我們對它進行乙個操作reduce i 該操作將數列中的元素ai和ai 1用乙個元素max ai,ai 1 替代,這樣得到乙個比原來序列短的新序列。這一操作的代價是max ai,ai 1 進行n 1次該操作後,可以得到乙個長度為1的序列。我們的任務是計算代價最小的redu...
題解 BOI2003 團夥
其實綠色有點看高了此題。此題只需要加乙個 敵人的敵人就是我的朋友 就可以了,而只要乙個人x與另一人y是敵人,x就和y的第乙個敵人是朋友就可以將x弄進y的敵人團夥,而y的敵人將全在那個團夥中 下面是 includeusing namespace std int bcj 5010 int e 5010 ...