複雜度o(mlogn)
輸入起點s,可以得到從起點到各點的最短路距離陣列dis[i]1.初始化:清空標記陣列,初始化距離陣列設為inf,起點距離設為0,開優先佇列,搜尋起點
2.搜尋:取出隊首並pop,如果隊首節點u的當前最短路比u的原先的最短路大則跳過,否則遍歷u的鄰接點如果v沒有被訪問過且u的最短路加上當前鄰接邊邊權小於原先v的最短路,則更新v的最短路且搜尋v
#includeusingnamespace
std;
typedef
long
long
ll;typedef unsigned
long
long
ull;
//typedef __int128_t ll;
typedef double
db;#define rep(a,b,c) for(ll a=b;a<=c;a++)
#define per(a,b,c) for(ll a=b;a>=c;a--)
#define go(a,b) for(ll a=head[b];a;a=e[a].to)
#define endl '\n'
#define v vector
#define pb push_back
#define mp make_pair
#define mem(a,b) memset(a,b,sizeof(a))
const ll amn=1e5+5,mod=1e9+7,inf=0x3f3f3f3f
;ll head[amn],etot;
struct
eg eg(ll to,ll v,db w):to(to),v(v),w(w){}
}e[amn];
void
einit()
void
add(ll u,ll v,db w)
void
adde(ll u,ll v,db w)
void
sovle();
intmain()
}ll n,m,k;
ll s,t;
struct
node
node(ll i,ll d):i(i),d(d){}
friend
bool
operator
<(node a,node b)
};ll vis[amn];
ll dis[amn];
void
dij(ll st)
dis[st]=0
; priority_queue
q;
while
(q.size())q.pop();
q.push(node(st,
0));
while
(q.size())}}
}void
sovle()
模板 堆優化Dijkstra
dij的核心思想 全域性最小值不會被其他節點更新,因此得到最小值後只需要擴充套件一次即可。概念 擴充套件 出隊 注意 vis 陣列表示的是每個節點是否擴充套件過,因此開始時vis st 不置1。時間複雜度 o m log n 如下 include using namespace std const ...
dijkstra和dijkstra堆優化模板
之前qaq一直沒有準備堆優化模板,本例以pat a1003為例,整理dijkstra和dijkstra堆優化模板 我們可以發現該篇幅找最小值部分是使用量乙個for迴圈 include include using namespace std int n,m,c1,c2 int edge 510 510...
dijkstra 堆優化 路徑
別人給的模板,所以不知道鏈結 include include include include include using namespace std define maxn 1020 define inf 0x3f typedef long long ll o nlogn typedef pair ...