加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 服务器 > 安全 > 正文

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

发布时间:2021-04-03 13:47:57 所属栏目:安全 来源:网络整理
导读:图的只操作复杂,但很在意义和意思。这里根据课本精华,实现一个图的最短路径算法,请参考。 准备计算课本P172,图6-13。如下: #include iostream #include string #includeiomanip //引入输入输出格式头文件using namespace std; const int Maxsize = 10;

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

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

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


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

程序运行时界面如下:

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


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

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读