zoukankan      html  css  js  c++  java
  • 图的邻接表存储结构

    程序调用入口

    using System;
    
    namespace Graphic_AdjacencyList
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                var adjacencyList = new AdjacencyList<char>();
    
                Console.WriteLine("1.初始化树结构:");
    
                Console.WriteLine("=================================");
                //添加顶点;
                adjacencyList.AddVertex('A');
                adjacencyList.AddVertex('B');
                adjacencyList.AddVertex('C');
                adjacencyList.AddVertex('D');
    
                //添加边;
                adjacencyList.AddEdge('A', 'B');
                adjacencyList.AddEdge('A', 'C');
                adjacencyList.AddEdge('A', 'D');
                adjacencyList.AddEdge('B', 'D');
                adjacencyList.AddEdge('C', 'D');
    
                Console.WriteLine("=================================");
    
                Console.WriteLine("2.树的邻接表遍历:");
                Console.WriteLine(adjacencyList.ToString());
                Console.Read();
            }
        }
    }
    图-顶点类

    namespace Graphic_AdjacencyList
    {
        /// <summary>
        ///     链表中的节点
        /// </summary>
        public class Node<T>
        {
            /// <summary>
            ///     邻接点域
            /// </summary>
            public Vertex<T> Adjvex;
    
            /// <summary>
            ///     下一个邻接点指针域
            /// </summary>
            public Node<T> Next;
    
            /// <summary>
            ///     链表中的节点
            /// </summary>
            /// <param name="value"></param>
            public Node(Vertex<T> value)
            {
                Adjvex = value;
            }
        }
    }
    图-链表中的表头节点类:

    using System;
    
    namespace Graphic_AdjacencyList
    {
        /// <summary>
        ///     链表中的表头节点
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class Vertex<T>
        {
            /// <summary>
            ///     数据
            /// </summary>
            public T Data;
    
            /// <summary>
            ///     邻接表表头指针
            /// </summary>
            public Node<T> FirstEdge;
    
            /// <summary>
            ///     访问标志,遍历时使用
            /// </summary>
            public Boolean Visited;
    
            /// <summary>
            ///     表头节点
            /// </summary>
            /// <param name="value"></param>
            public Vertex(T value) //构造方法;
            {
                Data = value;
            }
        }
    }
    
     图-图的邻接表存储类:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace Graphic_AdjacencyList
    {
        /// <summary>
        ///     图的邻接表存储类
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class AdjacencyList<T>
        {
            /// <summary>
            ///     图的顶点集合
            /// </summary>
            private readonly List<Vertex<T>> _items;
    
            public AdjacencyList()
                : this(10)
            {
            }
    
            public AdjacencyList(int capacity)
            {
                _items = new List<Vertex<T>>(capacity);
            }
    
            /// <summary>
            ///     添加顶点
            /// </summary>
            /// <param name="item"></param>
            public void AddVertex(T item)
            {
                if (Contains(item))
                {
                    throw new ArgumentException("插入了重复顶点!");
                }
                _items.Add(new Vertex<T>(item));
                Console.WriteLine("添加顶点:" + item);
            }
    
            /// <summary>
            ///     添加无向边
            /// </summary>
            /// <param name="from"></param>
            /// <param name="to"></param>
            public void AddEdge(T from, T to)
            {
                Vertex<T> fromVer = Find(from);
                if (fromVer == null)
                {
                    throw new ArgumentException("头顶点不存在!");
                }
                Vertex<T> toVer = Find(to);
                if (toVer == null)
                {
                    throw new ArgumentException("尾顶点不存在!");
                }
                //无向边的两个顶点都需记录边信息;
                AddDirectedEdge(fromVer, toVer);
                AddDirectedEdge(toVer, fromVer);
    
                Console.WriteLine(string.Format("添加无向边:{0}—{1}", from, to));
            }
    
    
            /// <summary>
            ///     添加有向边
            /// </summary>
            /// <param name="fromVer"></param>
            /// <param name="toVer"></param>
            private void AddDirectedEdge(Vertex<T> fromVer, Vertex<T> toVer)
            {
                if (fromVer.FirstEdge == null) //无临接点时;
                {
                    fromVer.FirstEdge = new Node<T>(toVer);
                }
                else
                {
                    Node<T> tem, node = fromVer.FirstEdge;
                    do
                    {
                        if (node.Adjvex.Data.Equals(toVer.Data))
                        {
                            throw new ArgumentException("添加了重复的边!");
                        }
                        tem = node;
                        node = node.Next;
                    } while (node != null);
                    tem.Next = new Node<T>(toVer); //添加到链表末尾;
                }
            }
            public bool Contains(T item)
            {
                //foreach (Vertex<T> v in _items)
                //{
                //    if (v.data.Equals(item))
                //    {
                //        return true;
                //    }
                //}
                return _items.Any(v => v.Data.Equals(item));
            }
    
            private Vertex<T> Find(T item)
            {
                //foreach (Vertex<T> v in _items)
                //{
                //    if (v.data.Equals(item))
                //    {
                //        return v;
                //    }
                //}
                return _items.FirstOrDefault(v => v.Data.Equals(item));
            }
    
            public override string ToString()
            {
                string result = string.Empty;
                foreach (var vertex in _items)
                {
                    if (vertex != null)
                    {
                        result += string.Format("顶点:{0}:", vertex.Data);
                        if (vertex.FirstEdge != null)
                        {
                            Node<T> tem = vertex.FirstEdge;
                            while (tem != null)
                            {
                                result += tem.Adjvex.Data.ToString();
                                tem = tem.Next;
                            }
                        }
                    }
                    result += "\r\n";
                }
                return result;
            }
        }
    }
    
    
    执行结果:




  • 相关阅读:
    HDU 3681 Prison Break 越狱(状压DP,变形)
    POJ 2411 Mondriaan's Dream (状压DP,骨牌覆盖,经典)
    ZOJ 3471 Most Powerful (状压DP,经典)
    POJ 2288 Islands and Bridges (状压DP,变形)
    HDU 3001 Travelling (状压DP,3进制)
    POJ 3311 Hie with the Pie (状压DP)
    POJ 1185 炮兵阵地 (状压DP,轮廓线DP)
    FZU 2204 7
    POJ 3254 Corn Fields (状压DP,轮廓线DP)
    ZOJ 3494 BCD Code (数位DP,AC自动机)
  • 原文地址:https://www.cnblogs.com/zhangqs008/p/2802190.html
Copyright © 2011-2022 走看看