为什么运行的结果是负数呢?
求两点之间最短距离程序
#include <iostream.h>
#define INFTY 100000
template<class T>
class MGraph
{
public:
MGraph(int mSize)
{
n = mSize;
a = new int*[n];
for(int i=0;i<n;i++)
a[i] = new int[n];
}
~MGraph()
{
for(int i=0;i<n;i++)
delete[]a[i];
delete []a;
a = NULL;
}
void Floyd(T**& d, int **& path);
void setl(T**a1);
private:
T**a; //动态生成二维数组a,存储图的邻接矩阵
int n; //图中顶点数
};
template<class T>
void MGraph<T>::setl(T**a1)
{ //对邻接矩阵进行初始赋值
a = new int*[n];
for(int i=0;i<n;i++)
a[i] = new int[n];
for( i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j] = a1[i][j];
}
template<class T>
void MGraph<T>::Floyd(T**& d, int **& path)
{
int i,j,k;
d= new T*[n];
path=new int *[n];
for(i=0;i<n;i++)
d[i]=new T [n];
path[i]=new int[n];
for(i=0;i<n;i++)
for (j=0;j<n;j++){
d[i][j]=a[i][j];
if (i!=j && a[i][j]<INFTY) path[i][j]=i;
else path[i][j]=-1;
}
for (k=0;k<n;k++)
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (d[i][k]+d[k][j] < d[i][j] )
{
d[i][j]=d[i][k]+d[k][j];
path[i][j]=path[k][j];
}
}
void main()
{
int n;
int **b;
int **d;
int **path;
cout<<"图中结点的个数为:"<<endl;
cin>>n;
b = new int*[n];
for(int i=0;i<n;i++)
b[i] = new int[n];
for( i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i == j)
continue;
cout<<"点"<<i<<"到点"<<j<<"的权值为:";
cin>>b[i][j];
if(b[i][j] == 0)
b[i][j] = INFTY;
}
MGraph<int> f(n);
f.setl(b);
f.Floyd(d, path);
for(i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cout<<"点"<<i<<"到点"<<j<<"的最短路径长度为:"<<d[i][j]<<endl;
cout<<"点"<<j<<"的直接前驱为:"<<path[i][j]<<endl;
}
}
#include <iostream.h>
#define INFTY 100000
template<class T>
class MGraph
{
public:
MGraph(int mSize)
{
n = mSize;
a = new int*[n];
for(int i=0;i<n;i++)
a[i] = new int[n];
}
~MGraph()
{
for(int i=0;i<n;i++)
delete[]a[i];
delete []a;
a = NULL;
}
void Floyd(T**& d, int **& path);
void setl(T**a1);
private:
T**a; //动态生成二维数组a,存储图的邻接矩阵
int n; //图中顶点数
};
template<class T>
void MGraph<T>::setl(T**a1)
{ //对邻接矩阵进行初始赋值
a = new int*[n];
for(int i=0;i<n;i++)
a[i] = new int[n];
for( i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j] = a1[i][j];
}
template<class T>
void MGraph<T>::Floyd(T**& d, int **& path)
{
int i,j,k;
d= new T*[n];
path=new int *[n];
for(i=0;i<n;i++)
d[i]=new T [n];
path[i]=new int[n];
for(i=0;i<n;i++)
for (j=0;j<n;j++){
d[i][j]=a[i][j];
if (i!=j && a[i][j]<INFTY) path[i][j]=i;
else path[i][j]=-1;
}
for (k=0;k<n;k++)
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (d[i][k]+d[k][j] < d[i][j] )
{
d[i][j]=d[i][k]+d[k][j];
path[i][j]=path[k][j];
}
}
void main()
{
int n;
int **b;
int **d;
int **path;
cout<<"图中结点的个数为:"<<endl;
cin>>n;
b = new int*[n];
for(int i=0;i<n;i++)
b[i] = new int[n];
for( i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i == j)
continue;
cout<<"点"<<i<<"到点"<<j<<"的权值为:";
cin>>b[i][j];
if(b[i][j] == 0)
b[i][j] = INFTY;
}
MGraph<int> f(n);
f.setl(b);
f.Floyd(d, path);
for(i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cout<<"点"<<i<<"到点"<<j<<"的最短路径长度为:"<<d[i][j]<<endl;
cout<<"点"<<j<<"的直接前驱为:"<<path[i][j]<<endl;
}
}
...全文
相关推荐
js代码-整数反转 1.考虑负数 2.溢出
js代码-整数反转 1.考虑负数 2.溢出
php代码-百度面试题 PHP重新排列数组的数,使得负数都排在正数的前
php代码-百度面试题 PHP重新排列数组的数,使得负数都排在正数的前
易语言怎么输入负数?易语言输入负数的方法
在本文中我们用图片方式给大家介绍了易语言输入负数的方法和步骤,有此需要的朋友们可以跟着学习下。
负数移位运算讲解
文中主要讲解了负数移位的实现过程。
正负数排列
正负数排列 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序。比如输入1、7、-5、9、-12、15,输出-5、-12、1、7、9、15。考虑有无时间复杂度O(N),空间复杂度O(1)的算法。


