Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitc278efa

Browse files
committed
feat(gomory-hu): add step-by-step description of the algorithm
1 parenta40adf7 commitc278efa

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

‎src/graph/gomory_hu.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,22 @@
22

33
##Definition
44

5-
The gomory-hu tree of an undirected graph with capacities consists of a weighted tree that condenses information from all the*s-t cuts* for all s-t vertex pairs in the graph. Naively, one must think that $O(|V|^2)$ flow computations are needed to build this data structure, but actually it can be shown that only $|V| - 1$ flow computations are needed. Once the tree is constructed, we can get the minimum cut between two vertices*s* and*t* by querying the minimum weight edge in the unique*s-t* path.
5+
The gomory-hu tree of an undirected graph$G$with capacities consists of a weighted tree that condenses information from all the*s-t cuts* for all s-t vertex pairs in the graph. Naively, one must think that $O(|V|^2)$ flow computations are needed to build this data structure, but actually it can be shown that only $|V| - 1$ flow computations are needed. Once the tree is constructed, we can get the minimum cut between two vertices*s* and*t* by querying the minimum weight edge in the unique*s-t* path.
66

77
##Gusfield's Simplification Algorithm
88

99
We can say that two cuts $(X, Y)$ and $(U, V)$*cross* if all four set intersections $X \cap U$, $X \cap V$, $Y \cap U$, $Y \cap V$ are nonempty. Most of the work of the original gomory-hu method is involved in maintaining the noncrossing condition. The following simpler, yet efficient method, proposed by Gusfield uses crossing cuts to produce equivalent flow trees.
1010

11+
Lets assume the vertices are 0-indexed for the next section
12+
The algorithm is composed of the following steps:
13+
14+
1. Create a (star) tree $T'$ on $n$ nodes, with node 0 at the center and nodes 1 through $n - 1$ at the leaves.
15+
2. For $i$ from 1 to $n - 1$ do steps 3 and 4
16+
3. Compute the minimum cut $(X, Y)$ in $G$ between (leaf) node $i$ and its (unique) neighbor $t$ in $T'$. Label the edge $(i, t)$ in $T'$ with the capacity of the $(X, Y)$ cut.
17+
4. For every node $j$ larger than $i$, if $j$ is a neighbor of $t$ and $j$ is on the $i$ side of $(X, Y)$, then modify $T'$ by disconnecting $j$ from $t$ and connecting $j$ to $i$. Note that each node $j$ larger than $i$ remains a leaf in $T'$
18+
19+
It is easy to see that at every iteration, node $i$ and all nodes larger than $i$ are leaves in $T'$, as required by the algorithm.
20+
1121
##Complexity
1222

1323
The algorithm total complexity is $\mathcal{O}(V*MaxFlow)$, wich means that the overall complexity depends on the algorithm that was choosen to find the maximum flow.
@@ -21,6 +31,8 @@ This implementation considers the Gomory-Hu tree as a struct with methods:
2131

2232
- The method*solve* returns a list that contains for each index $i$ the cost of the edge connecting $i$ and its parent, and the parent number.
2333

34+
- Note that the algorithm doesn't produce a*cut tree*, only an*equivalent flow tree*, so one cannot retrieve the two components of a cut from the tree $T'$.
35+
2436
```{.cpp file=gomoryhu}
2537
structgomory_hu {
2638
struct edg{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp