您的位置:首页 > 其它

每对顶点间最短路径;Floyd算法;写的很乱,判断太多了;没有用动态规划过程中构建路径;用O(n三次方)时间构造路径;

2010-04-05 12:38 453 查看
#include <iostream>
using namespace std;

#define NoEdge 1000

typedef struct
{
char *vertices;//图的顶点
int num;//顶点数量
int **edge;//边的权值
}Graph;

class Floyd
{
private:
int **dist;//最短路径权值和
int **path;//最短路径的前驱顶点
Graph graph;//邻接矩阵图
public:
Floyd(int num)
{
graph.num=num;
dist=new int* [num+1];
path=new int* [num+1];
graph.edge=new int* [num+1];
graph.vertices=new char [num+1];

for(int i=0;i<=num;i++)
{
dist[i]=new int [num+1];
path[i]=new int [num+1];
graph.edge[i]=new int [num+1];
}
}
void input()
{
for(int i=1;i<=graph.num;i++)
{
cin>>graph.vertices[i];
}
for(int i=1;i<=graph.num;i++)
{
for(int j=i+1;j<=graph.num;j++)
{
cout<<graph.vertices[i]<<","<<graph.vertices[j]<<endl;
cin>>graph.edge[i][j];
cout<<graph.vertices[j]<<","<<graph.vertices[i]<<endl;
cin>>graph.edge[j][i];
}
}
}
void floyd()
{
for(int i=1;i<=graph.num;i++)
{
for(int j=1;j<=graph.num;j++)
{
if(i!=j)
{
dist[i][j]=graph.edge[i][j];
}
else
{
dist[i][j]=0;
}
}
}

for(int k=1;k<=graph.num;k++)
{
for(int i=1;i<=graph.num;i++)
{
for(int j=1;j<=graph.num;j++)
{
if(i!=k&&j!=k&&i!=j)
{
if(dist[k][j]==NoEdge||dist[i][k]==NoEdge)
{
dist[i][j]=dist[i][j];
}
else
{
dist[i][j]=dist[i][j]<=dist[i][k]+dist[k][j]?  dist[i][j]:dist[i][k]+dist[k][j];
}
}
}
}
}
}

void getPath()
{
for(int i=1;i<=graph.num;i++)
{
for(int j=1;j<=graph.num;j++)
{
if(dist[i][j]==NoEdge)
{
path[i][j]=-1;
}
else
{
for(int k=1;k<=graph.num;k++)
{
if(j!=k)
{
if(dist[i][k]+graph.edge[k][j]==dist[i][j])
{
path[i][j]=k;
}
}
}
}
}
}
}
void printPath(int i,int j)
{
if(dist[i][j]==NoEdge)
{
exit(-1);
}
if(i==j)
{
cout<<graph.vertices[i]<<" ";
return;
}
printPath(i,path[i][j]);
cout<<graph.vertices[j]<<" ";
}
};

void main()
{
Floyd test(6);
test.input();
test.floyd();
test.getPath();
test.printPath(6,1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息