In class last time I presented a small undirected graph that defeated Dijkstra and (I claimed) would work with Floyd-Warshall. Unfortunately, the graph contained a negative cycle (a trivial one that got under my radar), hence the shortest-path problem is not well-defined. The fix is to make it a directed graph.
|
0 | 1 | 2 | 3 | |
0 | 10 | |||
1 | 4 | 3 | ||
2 | -6 | |||
3 |
0 | 1 | 2 | 3 | |
0 | 10 | 14 | 13 | |
1 | 4 | 3 | ||
2 | -6 | |||
3 |
0 | 1 | 2 | 3 | |
0 | 10 | 14 | 8 | |
1 | 4 | -2 | ||
2 | -6 | |||
3 |
Graph problems often need to find out whether graph contains a cycle. One way to answer this question is to use modify DFS (Readings 388) to see whether our search ever re-visits a vertex. Note that the modification in the course Readings considers two vertices with an undirected edge between them to be a cycle. Usually we're interested only in cycles with 3 or more distinct vertices, so this algorithm would have to be modified.
This approach runs into problems with a directed graph. Since, in a directed graph there may be a path from to , but not from to , the fact that has already been visited doesn't necessarily indicate a cycle. Consider the example from Readings p. 376 (Figure 8.4(b)). Although has already been visited, and found all the edges ``downstream'' from it, there is an edge from to that the simple DFS modification would flag as a cycle. We need to set a special value (perhaps ) if a node has been visited and all nodes reachable from it have been visited. Another way to do the same thing is to record arrival/departure numbers.