您的位置:首页 > 编程语言 > C语言/C++

佛洛依德 c++ 最短路径算法

2016-07-06 16:54 302 查看
//20142880 唐炳辉 石家庄铁道大学
#include<iostream>
#include<string>
using namespace std;
#define Maxnum 32767
#define N 100

typedef struct
{
string Dianarr
;
string info
;
int arcs

;
int DianNum,BianNum;
}FloydStruct;

int LocateVex(FloydStruct G, string a)
{
int i;
bool flag = 0;
for(i = 0;i < G.DianNum;i++)
if(a == G.Dianarr[i])
{
flag = 1;
return i;
}
if(flag == 0)
{
return -1;
}
}
void CreateUDN(FloydStruct &G)
{
cout << "请输入顶点数和边数:" << endl;
cin >> G.DianNum >> G.BianNum;
cout << "请输入顶点信息:"  << endl;
for(int i = 0;i<G.DianNum;i++)
cin >> G.Dianarr[i];
for(int i = 0;i<G.DianNum;i++)
for(int j = 0;j<G.DianNum;j++)
G.arcs[i][j] = Maxnum;
string v1,v2;
int w,i,j;
cout << "请输入存在路径的两个顶点和路径长度:" << endl;
for(int k = 0;k<G.BianNum;k++)
{
cin >> v1 >> v2 >> w;
i = LocateVex(G,v1);//获取点的数组下标
j = LocateVex(G,v2);
G.arcs[i][j] = w;//权值赋值给两点
}
}

int Path

;
int D

;
void Floyd(FloydStruct G)    //佛洛依德
{
for(int i = 0;i < G.DianNum;i++)
for(int j  = 0; j < G.DianNum;j++)
{
D[i][j] = G.arcs[i][j];
if(D[i][j]<Maxnum)
Path[i][j] = i;
else
Path[i][j] = -1;
}
for(int k = 0;k < G.DianNum;k++)/**核心**/
for(int i  = 0; i < G.DianNum;i++)
for(int j  = 0; j < G.DianNum;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 printFl(FloydStruct G)            //输出
{
/*string a,b;
int i,j,font = 1;
cout << "请输入当前位置和要去位置:" << endl;
cin >> a >> b;
//显示最短路径

i = LocateVex(G,a);
j = LocateVex(G,b);
if(D[i][j]==Maxnum)
cout << "最短距离为:" << "不可达!"<< endl;
else
cout << "最短距离为:" << D[i][j]<< endl;*/
for(int i=0;i<G.DianNum;i++)
{
for(int j=i+1;j<G.DianNum;j++)
{

if(D[i][j]!=Maxnum)
{int q =0;

int j1=j;
int a[20]={100};
while(1)
{

if(Path[i][j1]!=i)
{

a[q]=j1=Path[i][j1];

q=q++;

}
else
{
break;}
}

cout<<G.Dianarr[i]<<"------>";
for(int p=q-1;p>=0;p--)
{
cout<<G.Dianarr[a[p]]<<"------>";
}
cout<<G.Dianarr[j]<< D[i][j]<< endl;
}
}

}
//temp终点

}

void main()
{
FloydStruct G;
CreateUDN(G);//生成邻接矩阵
Floyd(G);
printFl(G);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: