最短路径—弗洛伊德算法

#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;
}


最短路径—弗洛伊德算法_第1张图片

最短路径—弗洛伊德算法_第2张图片

 

参考:http://blog.csdn.net/cxllyg/article/details/7606184

你可能感兴趣的:(最短路径—弗洛伊德算法)