#include <iostream>
using namespace std;
#define MaxInt 10000000000 //定义无限
#define MVNum 3000//最大顶点个数
typedef char VerTexType; //假设顶点的数据类型为字符型
typedef int ArcType;//假设边的权值为整型
typedef struct
{
VerTexType vexs[MVNum + 1];//顶点表
ArcType arcs[MVNum + 1][MVNum + 1]; //邻接矩阵,也即二维数组
//ArcType *arcs[MVNum + 1][MVNum + 1];
int vexnum, arcnum;//图当前的点数和边数
}AMGraph;
//求最小公倍数
int LCW(int& a,int& b) //求最小公倍数函数
{
int temp, i;
if (a < b) /*比较大小,使得a中存储大数,b中存储小数*/
{
temp = a;
a = b;
b = temp;
}
for (i = a; i <= a*b; i++) /*从大数开始寻找满足条件的自然数*/
if (i%a == 0 && i%b == 0)
{/*输出满足条件的自然数并结束循环*/
temp = i;
break;
}
return temp;
}
//图的邻接矩阵表示法
void CreateUDN(AMGraph* G)//创建无向图,采用邻接矩阵表示法
{
int m;
cin >> G->vexnum >> m;//输入n和m的值
for (int i = 1; i <= G->vexnum; i++)
G->vexs[i]=i;//依次输入点的信息
for (int i = 1; i <= G->vexnum; i++) //初始化邻接矩阵,边的权值均设置为最大值
{
for (int j = 1; j <= G->vexnum; j++)
G->arcs[i][j] = MaxInt;
}
for (int i = 1; i <= G->vexnum; i++)
for (int j = 1; j <= G->vexnum; j++)
{
int v1 = i;
int v2 = j;//v1和v2为两个点的位置
ArcType w;
if ((v1 - v2)*(v1 - v2) <= m * m)
{
w = LCW(v1, v2);//w为边的权值
G->arcs[v1][v2] = G->arcs[v2][v1] = w;
}
}
}
//求最短距离
void Floyd(AMGraph* G) {//Floyd算法求各点之间的最短路
int n = G->vexnum;
int i = 1;
for (int k = 1; k <= n; k++) {
if (G->arcs[i][k] == MaxInt)continue;
for (int j = 1; j <= n; j++) {
if (G->arcs[i][j] > G->arcs[i][k] + G->arcs[k][j])
G->arcs[i][j] = G->arcs[i][k] + G->arcs[k][j];
}
}
}
int main()
{
AMGraph G;
CreateUDN(&G);
Floyd(&G);
cout << G.arcs[1][G.vexnum];
return 0;
}
这里是报错: