Graph Theory
The Shortest Path
Luogu P4779 【模板】单源最短路径(标准版)
struct nod{
int x, w;
bool operator < (const nod &b)const{
return w > b.w;
}
};
#include<queue>
priority_queue<nod>q;
int dis[N];
inline void Dijkstra(int &st){
R(i,1,n) dis[i] = 2147483647;
dis[st] = 0,
q.push((nod){st,0});
while(!q.empty()){
int u = q.top().x, w = q.top().w;
q.pop();
if(dis[u] != w) continue;
for(register int i = head[u]; i; i = e[i].nxt){
int v = e[i].pre;
if(dis[v] > dis[u] + e[i].w){
dis[v] = dis[u] + e[i].w,
q.push((nod){v, dis[v]});
}
}
}
}
MST
LuoguP3366 【模板】最小生成树
//kruskal
R(i,1,n) fa[i] = i;
sort(a+1, a+cnt+1);
int sum = 0, tot = 1;
R(i,1,m){
int p = Find(a[i].x), q = Find(a[i].y);
if(p != q){
sum += a[i].w;
fa[p] = q;
if(++tot >= n) break;
}
}
//prim
int sum = 0;
R(i,1,n) g[i] = dis[1][i];
R(i,1,n){
int minn = 2147483647;
int u = 0;
R(j,1,n)
if(!vis[j] && g[j] < minn) {
minn = g[j],
u = j;
}
vis[u] = true,
ans += minn;
R(j,1,n)
if(!vis[j])
g[j] = Min(g[j], dis[u][j]);
}