克隆无向图
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;
}
}
//在忙,日后回来补全