1. 图的表示
// 顶点显示的符号
public char Symbol { get; set; }
// 顶点当前颜色
public VertexColor Color { get; set; }
// 顶点和开始节点之间的距离
public int Distance { get; set; }
// 广度遍历父节点
public GraphVertex Parent { get; set; }
// 深度优先搜索中的开始时间
public int StartTime { get; set; }
// 深度优先搜索中的结束时间
public int FinishTime { get; set; }
// 顶点对应的边
// 边开始顶点,在邻接表的存储中其实没有必要存储
public GraphVertex From { get; set; }
// 结束顶点
public GraphVertex To { get; set; }
// 边权重
// 数据成员,这里假设的是顶点的symbol是各个不相同的
private Hashtable graph =
new Hashtable();
2. 有向图的深度优先算法
// 深度优先遍历算法
public void DepthFirstVisit(GraphVertex v)
{
// 刚刚被发现,颜色为gray
Console.WriteLine(v.Symbol);
v.Color = VertexColor.GRAY;
this.time++;
// 开始时间
v.StartTime = this.time;
foreach (GraphEdge edge in v.FollowEdges)
{
// 还未被发现
if (edge.To.Color == VertexColor.WHITE)
{
edge.To.Parent = v;
DepthFirstVisit(edge.To);
}
}
// 如果边都已经发现完成
v.Color = VertexColor.BLACK;
this.time++;
v.FinishTime = this.time;
}
public void DepthFirstTravel()
{
// 全局时间变量
this.time = 0;
// 初始化
GraphVertex v;
foreach (DictionaryEntry e in this.graph)
{
v = (GraphVertex)e.Value;
v.Color = VertexColor.WHITE;
v.Parent = null;
}
// 递归调用
// 队所有的顶点
foreach (DictionaryEntry e in this.graph)
{
v = (GraphVertex)e.Value;
// 顶点为白色
if (v.Color == VertexColor.WHITE)
{
DepthFirstVisit(v);
}
}
3. 有向图的遍历算法:广度优先
// 广度优先遍历算法,同时生成广度优先树
public void BreadthFirstTravel(GraphVertex s)
{
// 初始化所有节点
GraphVertex v;
foreach (DictionaryEntry e in this.graph)
{
v = (GraphVertex)e.Value;
v.Color = VertexColor.WHITE;
v.Distance = int.MaxValue;
v.Parent = null;
}
// 发现第一个节点
s.Color = VertexColor.GRAY;
s.Distance = 0;
s.Parent = null;
// 初始化队列
Queue context =
new Queue();
context.Enqueue(s);
// 如果队列不空的话
while (context.Count != 0)
{
// 队首元素出队
v = context.Dequeue() as GraphVertex;
Console.WriteLine(v.Symbol);
// 遍历v的节点
foreach (GraphEdge item in v.FollowEdges)
{
if ( item.To.Color == VertexColor.WHITE)
{
item.To.Color = VertexColor.GRAY;
item.To.Distance = v.Distance + 1;
item.To.Parent = v;
context.Enqueue(item.To);
}
}
v.Color = VertexColor.BLACK;
}