public List <LakeEdge> BuildPasses()//List<LakeNode> lakes)
    {
        Dictionary <HashSet <ErosionNode>, LakeEdge> lake_passes = new Dictionary <HashSet <ErosionNode>, LakeEdge>();

        foreach (ErosionEdge edge in edges)
        {
            if (((ErosionNode)edge.GetNodes()[0]).Lake != ((ErosionNode)edge.GetNodes()[1]).Lake)
            {
                LakeEdge ledge = new LakeEdge(((ErosionNode)edge.GetNodes()[0]), ((ErosionNode)edge.GetNodes()[1]));
                if (!lake_passes.ContainsKey(ledge.Nodes) || ledge.Height < lake_passes[ledge.Nodes].Height)
                {
                    lake_passes[ledge.Nodes] = ledge;
                }
            }
        }
        List <LakeEdge> passes = new List <LakeEdge>();

        passes.AddRange(lake_passes.Values);

        /*
         * foreach (LakeNode lake in lakes)
         * {
         *  seen_lakes.Add(lake);
         *  Dictionary<LakeNode,LakeEdge> lake_passes = new Dictionary<LakeNode,LakeEdge>();
         *  foreach (ErosionNode node in lake.nodes)
         *  {
         *      foreach (ErosionNode other in node.GetNeighbors())
         *      {
         *          if (!seen_lakes.Any(l => l == other.Lake))
         *          {
         *              float height = Math.Max(node.Height, other.Height);
         *              if (!lake_passes.ContainsKey(other.Lake) || height < lake_passes[other.Lake].Height)
         *              {
         *                  lake_passes[other.Lake] = new LakeEdge(node, other);
         *              }
         *          }
         *      }
         *  }
         *  passes.AddRange(lake_passes.Values);
         * }
         */
        return(passes);
    }
    public List <LakeEdge> IteratePasses(List <LakeEdge> passes)
    {
        List <LakeEdge>    candidates    = new List <LakeEdge>();
        List <LakeEdge>    chosen_passes = new List <LakeEdge>();
        HashSet <LakeEdge> to_remove     = new HashSet <LakeEdge>();

        foreach (LakeEdge pass in passes)
        {
            int count = 0;
            foreach (ErosionNode node in pass.Nodes)
            {
                if (node.Lake.oceanic)
                {
                    count++;
                    pass.Receiver = node;
                    to_remove.Add(pass);
                }
            }
            if (count == 1)
            {
                candidates.Add(pass);
            }
            else if (count >= 2)
            {
                //Debug.Log(count);
                //candidates.Add(pass);
            }
        }
        foreach (LakeEdge pass in to_remove)
        {
            passes.Remove(pass);
        }

        while (candidates.Count > 0)
        {
            candidates.Sort((a, b) => a.Height.CompareTo(b.Height));

            LakeEdge pass = candidates[0];
            candidates.Remove(pass);
            chosen_passes.Add(pass);

            to_remove = new HashSet <LakeEdge>();
            foreach (LakeEdge c_pass in passes)
            {
                foreach (ErosionNode node in c_pass.Nodes)
                {
                    if (pass.Nodes.Any(t => t.Lake == node.Lake))
                    {
                        c_pass.Receiver = node;
                        to_remove.Add(c_pass);
                        candidates.Add(c_pass);
                        break;
                    }
                }
            }
            foreach (LakeEdge c_pass in to_remove)
            {
                passes.Remove(c_pass);
            }

            to_remove = new HashSet <LakeEdge>();
            foreach (LakeEdge c_pass in candidates)
            {
                if (c_pass.Source.Lake == pass.Source.Lake)
                {
                    to_remove.Add(c_pass);
                }
            }
            foreach (LakeEdge c_pass in to_remove)
            {
                candidates.Remove(c_pass);
            }
        }
        return(chosen_passes);
    }