Corrections

This commit is contained in:
Antti H S Laaksonen 2017-02-06 21:33:11 +02:00
parent 8781c5972f
commit aec16a3445
1 changed files with 73 additions and 69 deletions

View File

@ -2,19 +2,19 @@
\index{strongly connected graph}
In a directed graph, the directions of
the edges restrict possible paths in the graph,
In a directed graph,
the edges can be traversed in one direction only,
so even if the graph is connected,
this doesn't guarantee that there would be
a path between any two nodes.
Thus, it is meaningful to define a new concept
for directed graphs that requires more than connectivity.
this does not guarantee that there would be
a path from a node to another node.
For this reason, it is meaningful to define a new concept
that requires more than connectivity.
A graph is \key{strongly connected}
if there is a path from any node to all
other nodes in the graph.
For example, in the following picture,
the left graph is strongly connected,
the left graph is strongly connected
while the right graph is not.
\begin{center}
@ -50,7 +50,7 @@ from node 2 to node 1.
The \key{strongly connected components}
of a graph divide the graph into strongly connected
subgraphs that are as large as possible.
parts that are as large as possible.
The strongly connected components form an
acyclic \key{component graph} that represents
the deep structure of the original graph.
@ -125,11 +125,11 @@ The components are $A=\{1,2\}$,
$B=\{3,6,7\}$, $C=\{4\}$ and $D=\{5\}$.
A component graph is an acyclic, directed graph,
so it is easier to process than the original
graph because it doesn't contain cycles.
Thus, as in Chapter 16, it is possible to
construct a topological sort for a component
graph and also use dynamic programming algorithms.
so it is easier to process than the original graph.
Since the graph does not contain cycles,
we can always construct a topological sort and
use dynamic programming techniques like those
presented in Chapter 16.
\section{Kosaraju's algorithm}
@ -138,14 +138,14 @@ graph and also use dynamic programming algorithms.
\key{Kosaraju's algorithm} is an efficient
method for finding the strongly connected components
of a directed graph.
It performs two depth-first searches:
The algorithm performs two depth-first searches:
the first search constructs a list of nodes
according to the structure of the graph,
and the second search forms the strongly connected components.
\subsubsection{Search 1}
The first phase of the algorithm constructs
The first phase of Kosaraju's algorithm constructs
a list of nodes in the order in which a
depth-first search processes them.
The algorithm goes through the nodes,
@ -154,7 +154,7 @@ unprocessed node.
Each node will be added to the list
after it has been processed.
In the example graph the nodes are processed
In the example graph, the nodes are processed
in the following order:
\begin{center}
\begin{tikzpicture}[scale=0.9,label distance=-2mm]
@ -190,8 +190,8 @@ in the following order:
The notation $x/y$ means that
processing the node started at moment $x$
and ended at moment $y$.
When the nodes are sorted according to
ending times, the result is the following list:
The following list contains the nodes
sorted according to their ending times:
\begin{tabular}{ll}
\\
@ -206,10 +206,10 @@ node & ending time \\
3 & 14 \\
\\
\end{tabular}
In the second phase of the algorithm,
the nodes will be processed
in reverse order: $[3,7,6,1,2,5,4]$.
%
% In the second phase of the algorithm,
% the nodes will be processed
% in reverse order: $[3,7,6,1,2,5,4]$.
\subsubsection{Search 2}
@ -218,12 +218,12 @@ forms the strongly connected components
of the graph.
First, the algorithm reverses every
edge in the graph.
This ensures that during the second search,
we will always find a strongly connected
component without extra nodes.
This makes sure that during the second search,
we will always find strongly connected
components that do not have extra nodes.
The example graph becomes as follows
after reversing the edges:
After reversing the edges,
the example graph is as follows:
\begin{center}
\begin{tikzpicture}[scale=0.9,label distance=-2mm]
\node[draw, circle] (1) at (-1,1) {$7$};
@ -247,13 +247,14 @@ after reversing the edges:
\end{tikzpicture}
\end{center}
After this, the algorithm goes through the nodes
in the order defined by the first search.
If a node doesn't belong to a component,
After this, the algorithm goes through
the list of nodes created by the first search
in \emph{reverse} order.
If a node does not belong to a component,
the algorithm creates a new component
and begins a depth-first search
where all new nodes found during the search
are added to the new component.
and starts a depth-first search
that adds all new nodes found during the search
to the new component.
In the example graph, the first component
begins at node 3:
@ -286,8 +287,8 @@ begins at node 3:
\end{tikzpicture}
\end{center}
Note that since we reversed all edges in the graph,
the component doesn't ''leak'' to other parts in the graph.
Note that since all edges were reversed,
the component does not ''leak'' to other parts in the graph.
\begin{samepage}
The next nodes in the list are nodes 7 and 6,
@ -323,7 +324,8 @@ The next new component begins at node 1:
\end{center}
\end{samepage}
Finally, the algorithm processes nodes 5 and 5
\begin{samepage}
Finally, the algorithm processes nodes 5 and 4
that create the remaining strongy connected components:
\begin{center}
@ -353,13 +355,12 @@ that create the remaining strongy connected components:
\draw [red,thick,dashed,line width=2pt] (-6.5,0.5) rectangle (-7.5,-0.5);
\end{tikzpicture}
\end{center}
\end{samepage}
The time complexity of the algorithm is $O(n+m)$
where $n$ is the number of nodes and $m$
is the number of edges.
The reason for this is that the algorithm
The time complexity of the algorithm is $O(n+m)$,
because the algorithm
performs two depth-first searches and
each search takes $O(n+m)$ time.
both searches take $O(n+m)$ time.
\section{2SAT problem}
@ -378,8 +379,8 @@ or a negation of a logical variable
The symbols ''$\land$'' and ''$\lor$'' denote
logical operators ''and'' and ''or''.
Our task is to assign each variable a value
so that the formula is true or state
that it is not possible.
so that the formula is true, or state
that this is not possible.
For example, the formula
\[
@ -398,26 +399,27 @@ L_2 = (x_1 \lor x_2) \land
(\lnot x_1 \lor x_3) \land
(\lnot x_1 \lor \lnot x_3)
\]
is always false.
The reason for this is that we can't
is always false, regardless of how we
choose the values of the variables.
The reason for this is that we cannot
choose a value for variable $x_1$
without creating a contradiction.
If $x_1$ is false, both $x_2$ and $\lnot x_2$
should hold which is impossible,
and if $x_1$ is true, both $x_3$ and $\lnot x_3$
should hold which is impossible as well.
should hold which is also impossible.
The 2SAT problem can be represented as a graph
where the nodes correspond to
whose nodes correspond to
variables $x_i$ and negations $\lnot x_i$,
and the edges determine the connections
and edges determine the connections
between the variables.
Each pair $(a_i \lor b_i)$ generates two edges:
$\lnot a_i \to b_i$ and $\lnot b_i \to a_i$.
This means that if $a_i$ doesn't hold,
This means that if $a_i$ does not hold,
$b_i$ must hold, and vice versa.
The graph for formula $L_1$ is:
The graph for the formula $L_1$ is:
\\
\begin{center}
\begin{tikzpicture}[scale=1.0,minimum size=2pt]
@ -442,7 +444,7 @@ The graph for formula $L_1$ is:
\path[draw,thick,->] (7) -- (5);
\end{tikzpicture}
\end{center}
And the graph for formula $L_2$ is:
And the graph for the formula $L_2$ is:
\\
\begin{center}
\begin{tikzpicture}[scale=1.0,minimum size=2pt]
@ -475,32 +477,34 @@ a path from $x_i$ to $\lnot x_i$,
and also a path from $\lnot x_i$ to $x_i$,
so both $x_i$ and $\lnot x_i$ should hold
which is not possible.
However, if the graph doesn't contain
such a variable, then there is always a solution.
However, if the graph does not contain
such a variable $x_i$, then there is always a solution.
In the graph of formula $L_1$
no nodes $x_i$ and $\lnot x_i$
In the graph of the formula $L_1$
there are no nodes $x_i$ and $\lnot x_i$
such that both nodes
belong to the same strongly connected component,
so there is a solution.
In the graph of formula $L_2$
In the graph of the formula $L_2$
all nodes belong to the same strongly connected component,
so there are no solutions.
If a solution exists, the values for the variables
can be found by processing the nodes of the
component graph in a reverse topological sort order.
At each step, we process and remove a component
that doesn't contain edges that lead to the
remaining components.
If the variables in the component don't have values,
At each step, we process a component
that does not contain edges that lead to an
unprocessed component.
If the variables in the component
have not been assigned values,
their values will be determined
according to the component,
according to the values in the component,
and if they already have values,
they are not changed.
they remain unchanged.
The process continues until all variables
have been assigned a value.
The component graph for formula $L_1$ is as follows:
The component graph for the formula $L_1$ is as follows:
\begin{center}
\begin{tikzpicture}[scale=1.0]
\node[draw, circle] (1) at (0,0) {$A$};
@ -520,16 +524,16 @@ $B = \{x_1, x_2, \lnot x_3\}$,
$C = \{\lnot x_1, \lnot x_2, x_3\}$ and
$D = \{x_4\}$.
When constructing the solution,
we first process component $D$
we first process the component $D$
where $x_4$ becomes true.
After this, we process component $C$
After this, we process the component $C$
where $x_1$ and $x_2$ become false
and $x_3$ becomes true.
All variables have been assigned a value,
so the remaining components $A$ and $B$
don't change the variables anymore.
do not change the variables.
Note that this method works because the
Note that this method, works because the
structure of the graph is special.
If there are paths from node $x_i$ to node $x_j$
and from node $x_j$ to node $\lnot x_j$,
@ -543,8 +547,8 @@ and both $x_i$ and $x_j$ become false.
A more difficult problem is the \key{3SAT problem}
where each part of the formula is of the form
$(a_i \lor b_i \lor c_i)$.
No efficient algorithm for solving this problem
is known, but it is a NP-hard problem.
This problem is NP-hard, so no efficient algorithm
for solving the problem is known.