Introduce graphs.  Use img/Graph-Pics.odg
   - Vertices
   - Edges
   - Adjacency
   - Incidence
   - Directed/undirected
   - Path
   - Cycle
   - Loop
   - Multiedge
   - Connected component
   - Pipartite.

Graph representation: Infinite, but three ways you should know:
   1. Adjacency list
   2. Adjacency matrix
   3. Mathematical
   Show two example graphs  G1 & G2
      - Show html/g1.html (and html/g2.html)
       
   Show data structure: html/node.html

   Then adjacency matrix: html/g1-am.html

   Then mathematical definition.
   Talk about mathematical definition of a heap: html/pq.html

   Talk about other representations (e.g. "maze" in disjoint sets), disjoint set implementation.

Look at txt/g1.txt -- File representation.

DFS: Each node has "visited".  
     Do basic DFS algorithm
        - check visited
        - set visited
        - action
        - DFS(adjacent nodes)
        - action

     DFS good for connectivity.
     Do src/concomp.cpp to count connected components.

     Start with graph reading code. -- Write the DFS.

    Running time:

DFS for cycle detection

    Write it and have the bug.
    Fix it.
    Print the cycle.

Do LandMines first.  Then these five in a random order:

CarrotJumping
ColorfulRoad
OneRegister - I need scripts/one_register.
ArcadeManao
ThreeTeleports

Then these three in a random order:

InsertSort
HamiltonPath
Emoticons

Alarmed

------------------------------------------------------------
Spend some times going over DFS topcoder problems.  You don't need to code them up,
in fact I think that's counterintuitive.

1. LandMines -- They will implement in it in lab.  
     - Define the problem -- use the topcoder examples to describe it.
     - Talk aboout constraints -- we bump them to grid size <= 50,000.
     - Talk about how you build a graph.  Then it's simply a DFS.
     - Go over data structures -- go over how to build the adjacency lists efficiently.

2. ArcadeManao.
     - Use the pictures from the Topcoder problem spec to motivate the problem.
     - Build a graph -- show it from the thorpaw writeup.  Talk about doing the
       DFS with a value of L.  Each DFS gives you a yes or no.
     - Data structures -- Horizontal adjacency list & Vertical adjacency list.
     - Now, talk about binary search on L.  Running time.  I don't really like the RT
       in the writeup.
     - Use disjoints sets instead.  Running time.
      
3. HamiltonPath
     - Use scripts/hamilton.sh
     - Specify the problem and use the examples.
     - Break this into connected components.  Identify when a component is bad.
     - Now, talk about permuting the components
     - Then how you count the paths.

4. Alarmed
     - Use scripts/alarmed.sh
     - Use ../Alarmed/Drawings.odg to exemplify.