一本通學習筆記 最短路徑

2022-06-07 07:06:12 字數 2759 閱讀 7212

最短路徑常用演算法有dijkstra和spfa。spfa支援負數權重,但容易被毒瘤資料卡。

想讓spfa跑快點可以加入乙個小優化:用deque代替queue,然後在push的時候分類,如果比當前front的dis要小就push front,否則push back。

最短路計數和次短路問題仿照普通dp處理即可。次短路中嚴格非嚴格注意區別對待。

建模方面主要考慮分層圖等常見技巧。處理實際問題時可能結合二分答案或者列舉進行。

#include using namespace std;

const int max_node = 100005;

const int max_edge = 1000005;

template class graph_sp

void reset_graph(int n)

void reset_solver(int n)

void solvespfa(int v0, int n) }}

}};graph_spg;

int n, m, k;

struct edge

} e[max_edge];

int check(int lim)

g.solvespfa(1, n);

return g.d[n];

}int main()

sort(e + 1, e + m + 1);

int l = 0, r = 1e+9;

while (r > l)

cout << (l >= 1e+9 ? -1 : l) << endl;

}

#include using namespace std;

const int max_node = 100005;

const int max_edge = 200005;

template class graph_sp

void reset_graph(int n)

void reset_solver(int n)

void solvespfa(int v0, int n) }}

}};graph_spg1, g2;

int n, m, x, u, v, w;

int main()

g1.solvespfa(x, n);

g2.solvespfa(x, n);

int ans = 0;

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

cout << ans << endl;

}

#include using namespace std;

const int max_node = 5005;

const int max_edge = 200005;

template class graph_sp

void reset_graph(int n)

void reset_solver(int n)

void solvespfa(int v0, int n)

if (s[x] > d[p] + y && d[p] + y != d[x])

if (s[x] > s[p] + y && s[p] + y != d[x]) }}

}};graph_spg;

int n, m, u, v, w;

int main()

g.solvespfa(1, n);

cout << g.s[n] << endl;

}

#include using namespace std;

const int max_node = 100005;

const int max_edge = 1000005;

template class graph_sp

void reset_graph(int n)

void reset_solver(int n)

void solvespfa(int v0, int n) }}

}};graph_spg[6];

int n, m, p[6], u, v, w;

int perm[6] = ;

int main()

for (int i = 0; i < 6; i++)

int ans = 1e+9;

while (next_permutation(perm + 1, perm + 6))

cout << ans << endl;

}

#include using namespace std;

const int max_node = 100005;

const int max_edge = 1000005;

template class graph_sp

void reset_graph(int n)

void reset_solver(int n)

void solvespfa(int v0, int n) }}

}}

};int n, m, p, s, u, v, w;

graph_spg;

int main()

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

g.solvespfa(s, n);

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

}

一本通學習筆記 樹鏈剖分

loj上只掛了兩個無重的題,本來心想水一下,結果被sdoi2011染色那題卡了一發。儘管這題之前做過,但實現很不優美。今天wa的第一發一開始測樣例就掛了,強行除錯半天交上去一分沒有。後來仔細想了想怎樣寫比較清楚 儘管看起來好像有點冗餘 寫好以後一路順風一發就過。從這裡也有點感悟吧。include d...

學習筆記最短路徑

n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離 第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路 接下來m行兩個整數,表示相連的兩個城市的編號n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出 ...

《資訊學奧賽一本通》學習筆記 1

程式開頭使用 include include using namespace std int main char c b putchar c putchar x42 轉義字元 putchar 0x42 putchar 66 1.cout 表示式 2.cout 表示式1 表示式2 cin 變數 cin...