在csdn找的校园导游程序,但是最后运行的时候,最短路径全为0,找了原主也不在。
找的这个https://blog.csdn.net/weixin_45138636/article/details/103618210
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("对不起!两者不连通!");
}
}
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;
}
上面这个代码就是一个功能比较完善的,函数指针数组的一个使用场景了(建议大家也自己敲一敲实现一下嘻嘻😏😏😏)