c#实现图

 //先定义顶点信息,包括便签及访问记号
    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());
        }














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值