C#实现最短路径

来源:互联网 发布:手机淘宝没有卖家中心 编辑:程序博客网 时间:2024/05/17 08:08

//迪杰斯特拉算法:        /*         1.给定起点与终点,从起点开始找距离最小的点,再找距离找到点最小的(未找过的),直到找到终点         */        public static void Djstl(Graph g,int s,int e)        {             int[] label=new int[g.nums]; //标记是否找过            for (int i = 0; i < label.Length;i++ )            {                label[i] = -1;            }            label[0] = 1;            int sums=0;            Console.Write(s.ToString()+" ");            while(s!=e)            {                int low = 10000;                int k = s;                for (int j = 0; j < g.nums;j++ )                {                    if(label[j]==-1&&low>g.adjMatrix[s,j]&&g.adjMatrix[s,j]!=0)                    {                        low = g.adjMatrix[s, j];                        k = j;                    }                }                label[s]=1;                s = k;                Console.Write(s.ToString()+" ");            }        }
 //弗洛伊德算法        //初始化两个二维矩阵        //第一个用于记录个点到个点的距离,第二个用于记录i到j需要经过的中间点        //依次计算经过中间点时各个顶点距离的变化,若小于目前的点,则更改;并将第二个矩阵中的中间点也更改        public static void Flyd(Graph g, int s, int e)        {            int[,] JuLi = new int[g.nums, g.nums];            int[,] Point=new int[g.nums,g.nums];            //赋初始值            for(int i=0;i<g.nums;i++)            {                for (int j = 0; j < g.nums;j++ )                {                    JuLi[i,j]=g.adjMatrix[i,j];                    Point[i,j]=j;                }            }            //开始计算距离            for (int k = 0; k < g.nums; k++) //表示中间点为k            {                for (int i = 0; i < g.nums; i++)                {                    for (int j = 0; j < g.nums; j++)                    {                        if(JuLi[i,j]>JuLi[i,k]+JuLi[k,j])                        {                            JuLi[i, j] = JuLi[i, k] + JuLi[k, j];                            Point[i, j] = Point[i,k];//经过的中间点                        }                    }                }            }            Console.WriteLine("变化后JuLi:");            for (int i = 0; i < g.nums; i++)            {                for (int j = 0; j < g.nums; j++)                {                    Console.Write(JuLi[i, j].ToString() + " ");                }                Console.WriteLine();            }            Console.WriteLine("变化后Point:");            for (int i = 0; i < g.nums; i++)            {                for (int j = 0; j < g.nums; j++)                {                    Console.Write(Point[i, j].ToString() + " ");                }                Console.WriteLine();            }            Console.WriteLine(s.ToString() + "到" + e.ToString() + "的最短距离:"+JuLi[s,e].ToString());            Console.WriteLine(s.ToString() + "到" + e.ToString() + "的路径:");            Console.Write(s.ToString()+"  ");            while(s!=e)            {                Console.Write(Point[s,e].ToString()+" ");                s=Point[s,e];            }        }


1.使用迪杰斯特拉算法:
 //计算最短路径:迪杰斯特拉            int[,] a2 = {{0,1,5,  infinity,infinity,infinity,infinity,infinity,infinity},                        {1,0,3,  7,5,infinity,infinity,infinity,infinity},                        {5,3,0, infinity,1,7,infinity,infinity,infinity},                        {infinity,7,infinity,  0,2,infinity,3,infinity,infinity},                        {infinity,5,1,  2,0,3,6,9,infinity},                        {infinity,infinity,7,infinity,3,0,infinity,5,infinity},                        {infinity,infinity,infinity, 3,6,infinity,0,2,7},                        {infinity,infinity,infinity , infinity,9,5,2,0,4},                        {infinity,infinity,infinity,  infinity,infinity,infinity,7,4,0}                       };            Graph g2 = new Graph(9);            for (int i = 0; i < a2.GetLength(0); i++)            {                g2.Add_Vertex(ver[i]);                for (int j = 0; j < a2.GetLength(1); j++)                {                    g2.Add_Edge(i, j, a2[i, j]);                }            }string[] ver = { "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8" };            g2.Show_Graph();            Djstl(g2,0,8);
2.使用佛洛依德算法 //弗洛伊德算法 Flyd(g2,0,8);



原创粉丝点击