by jacky860226
1
2
3
4
2
8
13
7
6
$$G=(V,E)$$
2
4
3
2
1
8
13
7
6
2
6
7
13
8
4
3
2
1
6
7
13
8
2
4
3
2
1
6
7
13
8
2
4
3
2
1
6
7
13
8
2
4
3
2
1
6
7
13
8
2
4
3
2
1
6
7
13
8
2
4
3
2
1
6
7
13
8
2
4
3
2
1
6
7
13
8
2
4
3
2
1
6
7
13
8
2
4
3
2
1
#include <tuple>
#include <vector>
#include <algorithm>
#include <numeric> // for iota(first, last, val) setting iterator value
using namespace std;
struct DSU // disjoint set no rank-comp-merge
{
vector<int> fa;
DSU(int n) : fa(n) { iota(fa.begin(), fa.end(), 0); } // auto fill fa from 0 to n-1
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
void merge(int x, int y) { fa[find(x)] = find(y); }
};
int kruskal(int V, vector<tuple<int, int, int>> E) // save all edges into E, instead of saving graph via adjacency list
{
sort(E.begin(), E.end());
DSU dsu(V);
int mcnt = 0;
int ans = 0;
for (auto e : E)
{
int w, u, v; // w for weigth, u for start, v for destination
tie(w, u, v) = e;
if (dsu.find(u) == dsu.find(v))
continue;
dsu.merge(u, v);
ans += w;
if (++mcnt == V - 1)
break;
}
return ans;
}
$$G=(V,E)$$
\(u\)
\(v\)
\(V-S\)
\(S\)
\(e\)
\(v\)
\(u\)
\(S\)
\(V-S\)
\(u'\)
\(v'\)
a
b
c
d
e
\(e\)
\(e'\)
\(v\)
\(u\)
\(S\)
\(V-S\)
\(u'\)
\(v'\)
a
b
c
d
e
\(e\)
\(e'\)
\(v\)
\(u\)
\(S\)
\(V-S\)
\(u'\)
\(v'\)
a
b
c
d
e
\(e\)
\(e'\)
\(v\)
\(u\)
\(S\)
\(V-S\)
\(u'\)
\(v'\)
a
b
c
d
e
\(e\)
\(e'\)
a
d
b
g
f
c
e
5
7
9
15
6
8
11
9
7
8
5
\(S = \{a\}\)
a
d
b
g
f
c
e
5
7
9
15
6
8
11
9
7
8
5
\(S = \{a,d\}\)
a
d
b
g
f
c
e
5
7
9
15
6
8
11
9
7
8
5
\(S = \{a,d,f\}\)
a
d
b
g
f
c
e
5
7
9
15
6
8
11
9
7
8
5
\(S = \{a,d,f,b\}\)
a
d
b
g
f
c
e
5
7
9
15
6
8
11
9
7
8
5
\(S = \{a,d,f,b,e\}\)
a
d
b
g
f
c
e
5
7
9
15
6
8
11
9
7
8
5
\(S = \{a,d,f,b,e,c\}\)
a
d
b
g
f
c
e
5
7
9
15
6
8
11
9
7
8
5
\(S = \{a,d,f,b,e,c,g\}\)
#include <vector>
#include <queue>
#include <utility>
using namespace std;
#define enp pair<int, int> // pair<edge_val, node>
int prim_pq(vector<vector<enp>> E){
vector<bool> vis;
vis.resize(E.size(), false);
vis[0] = true;
priority_queue<enp, vector<enp>, greater<enp>> pq;
for(auto e: E[0]){
pq.emplace(e.first, e.second);
}
int ans = 0; // min value for MST
while(pq.size()){
int w, v; // edge-weight, vertex index
tie(w, v) = pq.top();
pq.pop();
if(vis[v])
continue;
vis[v] = true;
ans += w;
for(auto e: E[v]){
if(!vis[e.second])
pq.emplace(e.first, e.second);
}
}
return ans;
}
\(G=(V,E)\)
For any path \(p\), we call a \(Bottleneck(p)\) is an edge \(e \in p\)
which \(W(e)\) is maximum
A Minimum Bottleneck Path from \(u\) to \(v\)
is a path \(p\) from \(u\) to \(v\) which \(W(Bottleneck(p))\) is minimum
4
8
7
9
11
8
6
15
9
7
5
e
c
f
g
b
d
a
4
8
7
9
11
8
6
15
9
7
5
e
c
f
g
b
d
a