zoukankan      html  css  js  c++  java
  • 图Graph

    代码
    public class Graph<T>
    {
    /// <summary>
    /// 图包含接点
    /// </summary>
    public List<Node<T>> Nodes;
    public Graph()
    {
    Nodes
    = new List<Node<T>>();
    }
    }

    public class Node<T>
    {
    /// <summary>
    /// 接点值
    /// </summary>
    public T Value;
    /// <summary>
    /// 是否被访问过
    /// </summary>
    public bool IsVisited;
    /// <summary>
    /// 关系接点
    /// </summary>
    public List<Node<T>> AssociatedNodes;

    public Node(T value)
    {
    Value
    = value;
    IsVisited
    = false;
    AssociatedNodes
    = new List<Node<T>>();
    }
    }

    public class GraphFactory<T>
    {
    /// <summary>
    /// 创建一个简单的关系图
    /// </summary>
    /// <returns></returns>
    public static Graph<int> CreateSimpleGraph()
    {
    Graph
    <int> graph = new Graph<int>();
    int len = 20;
    int i = 1;
    //图中有len个接点
    for (i = 0; i < len; i++)
    graph.Nodes.Add(
    new Node<int>(i));

    //随机创建40条边,可重复
    Random random = new Random();
    for (i = 0; i < 40; i++)
    {
    int n1 = random.Next(0, len);
    int n2 = random.Next(0, len);
    //如果随机到相同的点
    if (n1 == n2)
    n2
    = (n1 + 1) % len;
    graph.Nodes[n1].AssociatedNodes.Add(graph.Nodes[n2]);
    graph.Nodes[n2].AssociatedNodes.Add(graph.Nodes[n1]);
    }

    return graph;
    }

    /// <summary>
    /// 打印图
    /// 显示各接点的关系接点
    /// </summary>
    /// <param name="graph"></param>
    public static void PrintGraph(Graph<T> graph)
    {
    foreach (Node<T> node in graph.Nodes)
    {
    Console.Write(
    "Node {0} connected to: ", node.Value);
    foreach (Node<T> associatednode in node.AssociatedNodes)
    Console.Write(
    "\t{0}", associatednode.Value);
    Console.WriteLine();
    }
    }

    /// <summary>
    /// 深度优先遍历
    /// </summary>
    /// <param name="graph"></param>
    public static void DepthFirstTraversal(Graph<T> graph)
    {
    Reset(graph);
    if (graph.Nodes.Count == 0)
    return;
    Node
    <T> node = GetNodeUnVisited(graph);
    while (node != null)
    {
    DepthFirstTraversal_Node(node);
    node
    = GetNodeUnVisited(graph);
    }
    }

    /// <summary>
    /// 广度优先遍历
    /// </summary>
    /// <param name="graph"></param>
    public static void BreadthFirstTraversal(Graph<T> graph)
    {
    Reset(graph);
    if (graph.Nodes.Count == 0)
    return;
    Node
    <T> node = GetNodeUnVisited(graph);
    Queue
    <Node<T>> nodequeue = new Queue<Node<T>>();

    while (node != null)
    {
    BreadthFirstTraversal_Node(node, nodequeue);
    node
    = nodequeue.DeQueue();
    if (node == null)
    node
    = GetNodeUnVisited(graph);
    }
    }
    #region private method
    /// <summary>
    /// 深度优先遍历接点
    /// 先访问该接点,然后递归其关系接点
    /// </summary>
    /// <param name="node"></param>
    private static void DepthFirstTraversal_Node(Node<T> node)
    {
    if (node.IsVisited || node == null)
    return;
    node.IsVisited
    = true;
    Console.WriteLine(
    "Node {0} is visited!", node.Value.ToString());
    foreach (Node<T> associatednode in node.AssociatedNodes)
    {
    DepthFirstTraversal_Node(associatednode);
    }
    }
    /// <summary>
    /// 广度优先遍历接点
    /// 访问该接点(如果该接点未被访问),然后将其关系接点(如果该接点未被访问)放入队列中
    /// </summary>
    /// <param name="node"></param>
    /// <param name="nodequeue"></param>
    private static void BreadthFirstTraversal_Node(Node<T> node, Queue<Node<T>> nodequeue)
    {
    if (node.IsVisited || node == null)
    return;
    node.IsVisited
    = true;
    Console.WriteLine(
    "Node {0} is visited!", node.Value.ToString());
    foreach (Node<T> n in node.AssociatedNodes)
    {
    if (!n.IsVisited)
    nodequeue.EnQueue(n);
    }
    }
    /// <summary>
    /// 获取图中一个未访问的接点
    /// </summary>
    /// <param name="graph"></param>
    /// <returns></returns>
    private static Node<T> GetNodeUnVisited(Graph<T> graph)
    {
    foreach (Node<T> node in graph.Nodes)
    if (!node.IsVisited)
    return node;
    return null;
    }
    /// <summary>
    /// 重新设置图中各接点的访问状态为false
    /// </summary>
    /// <param name="graph"></param>
    private static void Reset(Graph<T> graph)
    {
    foreach (Node<T> node in graph.Nodes)
    node.IsVisited
    = false;
    }
    #endregion
    }
  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/Googler/p/1752681.html
Copyright © 2011-2022 走看看