dijkstra演算法
從起點到終點求最短路 — 使用要求權值為正
1、求短路i
//題目 點數 500 邊數 1e5
#include
#include
#include
using
namespace std;
const
int n =
510,m =
1e5+10;
//時間複雜度o(n^m)
int n,m;
//鄰接矩陣
int a[n]
[n];
bool vis[n]
;//記錄已經遍歷的點
//記錄起點到某點的最短路徑
int d[n]
;int
dijkstra()
} vis[t]
=true
;for
(int j=
1;j<=n;
++j)}if
(d[n]
>=
0x3f3f3f3f
)return-1
;return d[n];}
intmain()
cout<<
dijkstra()
;return0;
}
2、求最短路ii
資料範圍 1e5 時間複雜度o(n^2) 超時!
優化思路:採用優先佇列 優化21、迴圈每個點
2、每次找距離起點最短距離的點
3、進行更新
採用鄰接表 優化3
優化後時間複雜度 o(mlogn)
#include
#include
#include
#include
using
namespace std;
const
int n =
1e6;
int n,m;
int d[n]
;bool vis[n]
;typedef pair<
int,
int>pii;
//構建鄰接表
int e[n]
,ne[n]
,w[n]
,h[n]
,idx;
void
add(
int a,
int b,
int c)
intdijkstra()
);//距離 結點
while
(q.size()
));}
}}if(d[n]
>=
0x3f3f3f3f
)return-1
;return d[n];}
intmain()
cout<<
dijkstra()
;return0;
}
模擬演算法例題
一 火柴棒 題目描述 給你n根火柴棍,你可以拼出多少個形如 a b c 的等式?等式中的a b c是用火柴棍拼出的整數 若該數非零,則最高位不能是0 用火柴棍拼數字0 9的拼法如圖所示 注意 1 加號與等號各自需要兩根火柴棍 2 如果a b,則a b c與b a c視為不同的等式 a b c 0 3...
manacher演算法 例題
簡單而有通俗的講解,講的太好了 證明對於一些我的理解,我會以 注釋的形式寫在 裡,我不懶 char str maxn char temp maxn 1 10 擴充套件後的字串 int len maxn 1 10 擴充套件後字串第i個位置回文串從中間到第有邊界的長度 相當於 回文子串長度 2 1 在用...
遞推演算法例題
例1 植樹節那天,有五位同學參加了植樹活動,他們完成植樹的棵樹都不相同,問第一位同學植了多少棵樹時,他指著旁邊的第二位同學說比他多植了兩棵 追問第二位同學他又說比第三位同學多植了兩棵,如此追問,都說比另一位同學多植兩棵。最後問道第五位同學時,他說自己種了10棵,問第一位同學植了多少棵?分析 設第一位...