// Shiyu's code
        public UndirectedGraph <TVertex, TEdge> Clone()
        {
            var g     = new UndirectedGraph <TVertex, TEdge>(this.allowParallelEdges);
            var nodes = this.adjacentEdges.Keys;

            foreach (var n in nodes)
            {
                g.AddVertex(n);
            }
            var edgesList = this.adjacentEdges.Values;

            foreach (var edges in edgesList)
            {
                foreach (var e in edges)
                {
                    g.AddEdge(e);
                }
            }

            return(g);
        }