《数据结构》图floyd算法示例-大家一定要看

前端之家收集整理的这篇文章主要介绍了《数据结构》图floyd算法示例-大家一定要看前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

图的只操作复杂,但很在意义和意思。这里根据课本精华,实现一个图的最短路径算法,请参考。

准备计算课本P172,图6-13。如下:


#include <iostream>  
#include <string>  
#include<iomanip>      //引入输入输出格式头文件
using namespace std;  
const int Maxsize = 10;  

class MGraph  
{  
public:  
    MGraph(string a,int n,int e);  
    void Floyd();  
    void print();  
private:  
    string vertex[Maxsize];  
    int arc[Maxsize][Maxsize];  
    int vertexNum,arcNum;  
    int dist[Maxsize][Maxsize];  
   string path[Maxsize][Maxsize];  
};  

MGraph:: MGraph(string a,int e)  
{   int i,j,k,info;  
    vertexNum = n;  
    arcNum = e;  
    for(i=0;i<vertexNum;i++)  
        vertex[i]=a[i];  

    for(i=0;i<vertexNum;i++)        //初始化边,请将不到达边初始值为最大值,这里使用10000
        for(j=0;j<vertexNum;j++)  
            arc[i][j]=10000;  

    for(k=0;k<arcNum;k++)          //输入图的边的顶点信息,将图顶点进行编号,从0开始
    {   cout<<"请输入边依附的两个顶点的编号"<<endl;  
        cin>>i>>j;  
        while(i>=vertexNum && j>=vertexNum)  
        {   cout<<"请重新输入"<<endl;  
            cin>>i>>j;  
        }  
        cout<<"请输入边的权值"<<endl;  //输入图的边的权值
        cin>>info;  
        while(info < 0)  
        {   cout<<"请重新输入"<<endl;  
            cin>>info;  
        }  
        arc[i][j]=info;  
    }  
  }  
void MGraph::Floyd()  
{   int i,k;  
    for(i=0;i<vertexNum;i++)           //初始化dist和path 
        for(j=0;j<vertexNum;j++)  
        {    dist[i][j] = arc[i][j]; 
			 if(dist[i][j] != 10000) 
				 path[i][j]=vertex[i]+vertex[j];  
             else path[i][j] =" ";  
        }  
    for(k=0;k<vertexNum;k++)                      //判定顶点i j之间是否经过k
        for(i=0;i<vertexNum;i++)  
            for(j=0;j<vertexNum;j++)  
                if(dist[i][k]+dist[k][j]<dist[i][j])
				{   dist[i][j]=dist[i][k]+dist[k][j];  
                    path[i][j]=path[i][k]+"-"+path[k][j];  
                } 
}  
void MGraph::print()    //结点m到n的最短路径  
{    int a,b,i;  
	cout<<"图的所有路径如下:"<<endl;  
	for(i=0;i<vertexNum;i++)  //输出图的所有路径信息
    {   for(int j=0;j<vertexNum;j++)  
           cout<<setw(10)<<setiosflags(ios::left)<<path[i][j]<<" ";    //10个字符位置,且左对齐
        cout<<endl;  
    }  
	cout<<"图的所有路径长如下:"<<endl;  
    for(i=0;i<vertexNum;i++)  //输出图的各边长信息
    {  for(int j=0;j<vertexNum;j++)  
		cout<<setw(3)<<setiosflags(ios::left)<<dist[i][j]<<" ";   //3个字符位置,且左对齐
       cout<<endl;  
    }  
    cout<<"您想了解哪两个点的最短路径?请输入这两个点"<<endl;  
    string ch1,ch2;  
    cin>>ch1>>ch2;        //输入要判定是的顶点,请输入顶点字符。       
    for(i=0;i<vertexNum;i++)  
        if(vertex[i] == ch1) a=i;  
    for(i=0;i<vertexNum;i++)  
        if(vertex[i] == ch2) b=i;  
    cout<<ch1<<"到"<<ch2<<"的最短路径为:"<<path[a][b]<<"长度为"<<dist[a][b]<<endl;  
	system("pause");
}  
     
int main()  
{  int n,e;
   string ch;  
   cout<<"请输入顶点数和边数,空格格开:"<<endl;  
   cin>>n>>e;
   cout<<"请输入依次输入各个顶点字符串:"<<endl;  
   cin>>ch;
    MGraph m(ch,n,e);  
    m.Floyd();  
    m.print();  
    return 0;  
}

程序运行时界面如下:


大家可以输入其它图形进行验证。祝大家成功。

猜你在找的数据结构相关文章