克隆无向图

2019-07-10  本文已影响0人  devmisaky
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Collections;

class Program

{

    public class UndirectedGraphNode

    {

    public int label;

    public IList<UndirectedGraphNode> neighbors;

    public UndirectedGraphNode(int x) { label = x; neighbors = new List<UndirectedGraphNode>(); }

    };

    static void Main(string[] args)

    {

        //克隆一张无向图,图中的每个节点包含一个 label (标签)和一个 neighbors (邻接点)列表 。

        //OJ的无向图序列化:

        //节点被唯一标记。

        //我们用 # 作为每个节点的分隔符,用 , 作为节点标签和邻接点的分隔符。

        //例如,序列化无向图 {

        //            0,1,2#1,2#2,2}。

        //该图总共有三个节点, 被两个分隔符  # 分为三部分。

        //第一个节点的标签为 0,存在从节点 0 到节点 1 和节点 2 的两条边。

        //第二个节点的标签为 1,存在从节点 1 到节点 2 的一条边。

        //第三个节点的标签为 2,存在从节点 2 到节点 2(本身) 的一条边,从而形成自环。

        //我们将图形可视化如下:

        //      1

        //      / \

        //    /  \

        //    0-- - 2

        //        / \

        //        \_ /

        string[] strs = Console.ReadLine().Split('#');

        for(int i = 0; i < strs.Length; i++)

        {

            string[] tmpStrs = strs[i].Split(',');

            UndirectedGraphNode node = new UndirectedGraphNode(int.Parse(tmpStrs[0]));

            List<UndirectedGraphNode> neighbors = new List<UndirectedGraphNode>();

            for (int j=1;j < tmpStrs.Length; j++)

            {

                UndirectedGraphNode tmpNode = new UndirectedGraphNode(int.Parse(tmpStrs[j]));

                neighbors.Add(tmpNode);

            }

            node.neighbors = neighbors;

            CloneGraph(node);

        }



    }

    private static UndirectedGraphNode CloneGraph(UndirectedGraphNode node)

    {

        return Clone(node);

    }

    private static Hashtable map = new Hashtable();

    private static UndirectedGraphNode Clone(UndirectedGraphNode node)

    {

        if (node == null) return null;

        if (map.ContainsKey(node.label))

        {

            return map[node.label] as UndirectedGraphNode;

        }

        UndirectedGraphNode clone = new UndirectedGraphNode(node.label);

        map.Add(clone.label, clone);

        for (int i = 0; i < node.neighbors.Count; i++)

        {

            clone.neighbors.Add(node.neighbors[i]);

        }

        //打印

        Console.Write(clone.label);

        for(int i = 0; i < clone.neighbors.Count; i++)

        {

            Console.Write(" " + clone.neighbors[i].label);

        }

        Console.WriteLine();

        return clone;

    }

}

//在忙,日后回来补全
上一篇下一篇

猜你喜欢

热点阅读