#include <iostream>
#include <string>
using namespace std;
typedef struct graph
{
string vertex[10];
int arc[10][10];
int num_vertex;
int num_edge;
}graph;
int get_location(graph g, string s)
{
int i;
for(i=0;i<g.num_vertex;i++)
{
if(s == g.vertex[i])
return i;
}
return -1;
}
void create_graph(graph &g)
{
string s1,s2;
int i,j,k,w;
cout<<"请输入顶点数和边数:";
cin>>g.num_vertex>>g.num_edge;
cout<<"请输入各个顶点:";
for(i=0;i<g.num_vertex;i++)
cin>>g.vertex[i];
for(i=0;i<g.num_vertex;i++)
for(j=0;j<g.num_vertex;j++)
g.arc[i][j]=65535;
cout<<"请输入边和权值:"<<endl;
for(k=0;k<g.num_edge;k++)
{
cin>>s1>>s2>>w;
i = get_location(g,s1);
j = get_location(g,s2);
g.arc[i][j]=w;
}
}
void shortestpath(graph &g, int p[10][10], int d[10][10])
{
int i,j,k;
for(i=0;i<g.num_vertex;i++)
for(j=0;j<g.num_vertex;j++)
{
d[i][j] = g.arc[i][j];
p[i][j] = j;
}
for(i=0;i<g.num_vertex;i++)
for(j=0;j<g.num_vertex;j++)
for(k=0;k<g.num_vertex;k++)
{
if(d[j][k] > d[j][i] + d[i][k])
{
d[j][k] = d[j][i] + d[i][k];
p[j][k] = p[j][i];
}
}
}
void print_path(graph g, int p[10][10], int d[10][10])
{
int i,j;
cout<<"各顶点间最短长度及路径如下:"<<endl;
for(i=0;i<g.num_vertex;i++)
{
for(j=0;j<g.num_vertex;j++)
{
if(j == i)
continue;
if(d[i][j] == 65535)
cout<<g.vertex[i]<<"到"<<g.vertex[j]<<"路径不可达";
else
{
cout<<g.vertex[i]<<"到"<<g.vertex[j]<<"最短长度为:"<<d[i][j]<<" "<<"最短路径为:";
cout<<g.vertex[i];
int k = p[i][j];
if(k!=j)
{
cout<<"->"<<g.vertex[k];
k = p[k][j];
}
cout<<"->"<<g.vertex[j];
}
cout<<endl;
}
cout<<endl<<endl;
}
}
int main()
{
graph g;
create_graph(g);
int p[10][10];
int d[10][10];
shortestpath(g,p,d);
print_path(g,p,d);
return 0;
}
参考:http://blog.csdn.net/cxllyg/article/details/7606184