class Vertex
{
public string label;
public bool visited;
//构造函数用于初始化
public Vertex(string l)
{
this.label = l;
this.visited = false;
}
}
class Graph
{
//顶点,邻接矩阵
public int nums;
public Vertex[] ver;
public int[,] adjMatrix;
static int index;
//初始化图
public Graph(int nums)
{
this.nums = nums;
ver = new Vertex[nums];
adjMatrix = new int[nums, nums];
index = 0;
for (int i = 0; i < nums; i++)
{
for (int j = 0; j < nums; j++)
{
adjMatrix[i, j] = 0;
}
}
}
//显示图的邻接矩阵
public void Show_Graph()
{
for (int i = 0; i < nums; i++)
{
for (int j = 0; j < nums; j++)
{
Console.Write(adjMatrix[i, j].ToString() + " ");
}
Console.WriteLine();
}
}
//增加顶点
public void Add_Vertex(string label)
{
ver[index++] = new Vertex(label);
}
//增加边
public void Add_Edge(int i, int j, int weight)
{
adjMatrix[i, j] = weight;
}
//显示第n个顶点的标签
public void Show_n_label(int n)
{
Console.WriteLine(ver[n].label);
}
//获得label的序号
public int Get_label_Index(string la)
{
for (int i = 0; i < ver.Length; i++)
{
if (string.Compare(ver[i].label, la) == 0)
{
return i;
}
}
return -1;
}
//设置访问过的点
public void Set_n_visited(int n)
{
ver[n].visited = true;
}
}
//实现深度优先遍历
public static void DFS(Graph g, int m)
{
g.ver[m].visited = true;
g.Show_n_label(m);
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
int a = g.adjMatrix[i, j];
if (g.ver[j].visited == false && g.adjMatrix[i, j] > 0 && g.adjMatrix[i, j] != 10000)
{
DFS(g, j);
}
}
}
}
//广度优先遍历,需要用一个队列实现
public static void BFS(Graph g)
{
Queue<Vertex> qg = new Queue<Vertex>();
qg.Enqueue(g.ver[0]);
g.ver[0].visited = true;
while (qg.Any())
{
Vertex v = qg.Dequeue();
int i = g.Get_label_Index(v.label);
Console.Write(v.label + "->");
for (int j = 0; j < 9; j++)
{
if (g.ver[j].visited == false && g.adjMatrix[i, j] > 0)
{
g.ver[j].visited = true;
qg.Enqueue(g.ver[j]);
}
}
}
}
//求最小生成树,普里姆算法(Prim)
//先给定一个初始点,然后找到离它最近的点,并加入找的点序列,将其对应的距离设为0
//然后找其它顶点距离新的找到点集合最小的点,再加入找到的点序列
//重复以上过程
public static void Prim_MiniTree(Graph g)
{
//存放找到的点
string[] label_checked = new string[g.nums];
//存放最短距离,是动态变化的,第n个位置记录的是第n个点到当前点的最短距离
int[] lowest_length = new int[g.nums];
//设置初始点,设置初始点到其他的距离
label_checked[0] = g.ver[0].label;
lowest_length[0] = 0;
for (int j = 1; j < g.nums; j++)
{
lowest_length[j] = g.adjMatrix[0, j];
label_checked[j] = " ";
}
Console.WriteLine(label_checked[0].ToString() + " 0 0");
//循环找其他点的最短距离
int sum = 0;
for (int i = 1; i < g.nums; i++)
{
int min = 100000, k = 0;
//先找此点到其他点的最短距离,并记录下是哪个点
for (int j = 0; j < g.nums; j++)
{
if (lowest_length[j] != 0 && lowest_length[j] < min)
{
min = lowest_length[j];//得到距离向量中的最短值
k = j;//第几个最短
label_checked[j] = g.ver[j].label;
}
}
//打印节点
sum += min;
Console.WriteLine(label_checked[k].ToString()+" "+k.ToString()+" "+min.ToString());
lowest_length[k] = 0;//代表这个点已经找到了
//再次循环,更新其他点到已经找到点距离
for (int j = 1; j < g.nums;j++ )
{
if(lowest_length[j]!=0&&lowest_length[j]>g.adjMatrix[k,j])
{
lowest_length[j]=g.adjMatrix[k,j];//更新值
}
}
}
Console.WriteLine("\n最小生成树的最短距离为:"+sum.ToString());
}