在csdn找的校园导游,求解答

在csdn找的校园导游程序,但是最后运行的时候,最短路径全为0,找了原主也不在。
找的这个https://blog.csdn.net/weixin_45138636/article/details/103618210

img


public static void ShortestPath_DIJ(Graph graph,int v0,int v1)
    {
        ihttps://img-mid.csdnimg.cn/release/static/image/mid/ask/151690907686111.png "#left")
nt n = graph.vexnum;            //先把地图的位置顶点用n来表示
        boolean [] S = new boolean[n];    //每执行一次循环找出最小路径,如果找出一个最小路径就把该点置为true
        int [] D = new int[n];            //存权值(最小的),如果有更小的将会代替该位置上大的权值
        int [] Path = new int[n];        //记录该索引顶点的前驱顶点

        //初始化,先找出v0结点的邻居结点的各个权值
        for(int i = 0; i < n; i ++)
        {
            S[i] = false;                 //S中先都置为false
            D[i] = graph.arcs[v0 -1][i];     //最开始先把v0与其他几个顶点的权值赋值给D[i]
            if(D[i] != MaxInt && D[i] != 0)
                Path[i] = v0 - 1;            //第i个顶点的前驱结点就是v0,表示i和v0相邻
            else
                Path[i] = -1;            //表示i顶点和v0顶点没有相邻,如果相邻必有权值不为无穷大
        }
        S[v0 - 1] = true;                    //v0与v0之间路径为0,我们不再讨论

        int v = - 1;
        //对剩下的n-1个顶点循环。
        for(int i = 1; i < n; i++)
        {
            int m = MaxInt;
            //找出D中最小的路径
            for(int w = 0; w < n; w++)
                if(!S[w] && D[w] < m)
                {
                    m = D[w];            //依次比较D中的权值,找出最小的权值
                    v = w;            //把这个最小权值的位置赋值给v(记录下来)
                }
            if(v != -1)                //表示我们找到了D中的最小路径
            {
                S[v] = true;        //我们找到了最小路径,我们把它置为true,以防下次还找到它
                for(int w = 0; w < n; w++)
                    if(!S[w] && D[v] + graph.arcs[v][w] < D[w])        //如果原来的路径D[w](0-n)依次和v0到v的权值再加上v到w的权值进行比较
                    {
                        D[w] = D[v] + graph.arcs[v][w];                //如果小于了,等于说有最优路径,我们把最优路径赋值给D[w]
                        Path[w] = v;                                //并把w的前驱置为v
                    }
            }
        }
        int [] a = new int[n];
        for(int i = 0; i < Path.length; i++)
        {
            a[i] = -1;
            if(Path[v1 - 1] == v0 - 1)
            {
                continue;
            }
            else
            {
                a[i] = Path[v1 - 1];
                if(Path[v1 - 1] != -1)
                    Path[v1 - 1] = Path[Path[v1 - 1]];
            }
        }
        if(D[v1 - 1] != MaxInt)
        {
            System.out.print("路径是:" + graph.vexs[v0 - 1].name);
            for(int i = a.length - 1; i >= 0; i --)
            {
                if(a[i] != -1)
                {
                    System.out.print("->" + graph.vexs[a[i]].name);
                }
            }
            System.out.print("->" + graph.vexs[v1 - 1].name + "\n");
            printf("最短距离为:" + D[v1 - 1]);
        }
        else
            printf("对不起!两者不连通!");
    }
}

img


名字要和上面对应

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7482646
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:全CSDN最拉跨的最速下降法,懒得写注释,自己看,复杂度爆炸
  • 除此之外, 这篇博客: csdn全站最精细入微的指针内容中的 2.2函数指针数组的具体使用场景(好戏还在后面😃😃😃) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • int Add(int x, int y)
    {
    	return x + y;
    }
    int Sub(int x, int y)
    {
    	return x - y;
    }
    int Mul(int x, int y)
    {
    	return x * y;
    }
    int Div(int x, int y)
    {
    	return x / y;
    }
    int main()
    {
    	int(*parr[4])(int, int) = { Add,Sub,Mul,Div};
    	int i = 0;
    	for (i = 0; i < 4; i++)
    	{
    		printf("%d\n", parr[i](2, 3));
    	}
    	
    	return 0;
    }
    
    

    功能所在:上面代码其实可以初步向我们展示函数指针数组的功能,他其实就是方便在当我们调用多个函数时,省去我们重复写调用函数的代码,如果有函数指针数组的话,我们直接访问函数指针数组的元素内容就可以了,然后向我们得到的函数名传相应的参数就可以了
    下面给大家做一个功能较完整的函数指针数组的使用吧,上面的代码只能对这个数组的使用简单介绍一下,下面我们来完整的实现一下这个数组吧!!!

    void menu()
    {
    	printf("*******************************\n");
    	printf("****1.Add          2.Sub*******\n");
    	printf("****3.Mul         4.Div********\n");
    	printf("********   0.Exit   ***********\n");
    	printf("*******************************\n");
    }
    int Add(int x, int y)
    {
    	return x + y;
    }
    int Sub(int x, int y)
    {
    	return x - y;
    }
    int Mul(int x, int y)
    {
    	return x * y;
    }
    int Div(int x, int y)
    {
    	return x / y;
    }
    int main()
    {
    	menu();
    	int input = 0;
    	int x = 0;
    	int y = 0;
    	int (*(parr)[4])(int, int) = { Add,Sub,Mul,Div };
    	do
    	{
    		printf("请输入您要选择的菜单的序号:>");
    		scanf("%d", &input);
    		if (input == 0)
    		{
    			printf("退出程序");
    		}
    		else if (input <= 1 && input <= 4)
    		{
    			 printf("请输入两个操作数:>");
    			 scanf("%d %d", &x, &y);
    			 printf("%d\n", parr[input - 1](x, y));
    			 printf("请继续选择输入您要的序号:>");
    		}
    		else
    		{
    			printf("输入错误,请重新输入");
    		}
    	} while (input);
    	
    	return 0;
    }
    

    上面这个代码就是一个功能比较完善的,函数指针数组的一个使用场景了(建议大家也自己敲一敲实现一下嘻嘻😏😏😏)

  • 您还可以看一下 CSDN就业班老师的CSDN首期架构班开学典礼——直播回放课程中的 CSDN首期架构班——开学典礼小节, 巩固相关知识点