C++代码,数据结构-最短路径(两种情况)(迪杰斯特拉算法和弗洛伊德算法)

1.单源的,从有向图某个源点, 到其他点的最短路径

利用算法迪杰斯特拉算法;

Dijkstra算法的基本思想:

一个辅助数组D[max_v];每个D[i]表示当前所知源点到vi的最短路径的长度

一个辅助集合S,记录已找到最短路径的顶点的集合,他是逐步补充的;知道S集合包括所有点,起初S集合包含源点

1.先找出源点直接可达到顶点i,并把权记录到D[i]中,不可达到顶点记为最大值;

2.然后进行n-1次循环,把其他点一次找出最短路径;

每次循环先找出D中最小的值min,和v(D[v]=min); 把v加入到集合S中,

3.然后寻找不属于S集合的点w,如果min+dut(v-w的权值)

4.重复2,和3,知道S集合包括所有点。

下面是代码,我自己又写了一个函数来呈现结果,

#include
#include
#define Max_v 200
using namespace std;


//算法7.15 最短路径
struct Arccell{
int adj;
};
typedef Arccell adjmatric[Max_v][Max_v];
struct Mgraph{
char vexs[Max_v];   //顶点向量
adjmatric arcs;   //邻接矩阵
int  vexnum,arcnum;  //顶点数 和 弧数


};


int locate(Mgraph G,char ch){
for(int i=0;i!=G.vexnum;++i){


    if(G.vexs[i]==ch)return i;


}
}


void createDG(Mgraph &G){//采用数组表示法,构造有向图
    cout<<"Please enter the vexnum and arcnum of the G graph"<>G.vexnum>>G.arcnum;
 cout<<"Please enter the dians of G"<>G.vexs[i];}//构造顶点向量
    for(int i=0;i!=G.vexnum;++i){//初始化矩阵
     for(int j=0;j!=G.vexnum;++j){
        G.arcs[i][j].adj=10000;
        }
    }
char v1,v2;int w;
cout<<"Please enter "<>v1>>v2>>w;
    int i=locate(G,v1); int j=locate(G,v2);
    G.arcs[i][j].adj=w;
}
}


void printgraph(Mgraph M){
cout<<"\n"<<"The graph has "<>"<>"<>x;
Shortestpath(m,locate(m,x),pathbool,D);
cout<<"请输入终点";
cin>>y;
int iy=locate(m,y);
if(D[iy]==10000)cout<<"不可达"<>"<

rebuf.txt:

6 8
a b c d e f 
a c 10
a e 30 
a f 100
b c 5
c d 50
d f 10
e d 20
e f 60



运行结果:

C++代码,数据结构-最短路径(两种情况)(迪杰斯特拉算法和弗洛伊德算法)_第1张图片

2.每一对顶点之间的最短路径

首先可以利用迪杰斯特拉算法来解决,上面最后已经给出了方法。

下面使用弗洛伊德算法,时间复杂度相同,但是形式上更加简洁。


过了一个春节,有好几天没动,真是罪过,今天总算把艰苦的第七章给结束了,Floyd算法。

直接上代码:

#include
#include
#define Max_v 200
using namespace std;

//算法7.16 最短路径,Floyd算法
struct Arccell{
int adj;
};
typedef Arccell adjmatric[Max_v][Max_v];
struct Mgraph{
char vexs[Max_v];   //顶点向量
adjmatric arcs;   //邻接矩阵
int  vexnum,arcnum;  //顶点数 和 弧数

};

int locate(Mgraph G,char ch){
for(int i=0;i!=G.vexnum;++i){

    if(G.vexs[i]==ch)return i;

}
}

void createDG(Mgraph &G){//采用数组表示法,构造有向图
    cout<<"Please enter the vexnum and arcnum of the G graph"<>G.vexnum>>G.arcnum;
 cout<<"Please enter the dians of G"<>G.vexs[i];}//构造顶点向量
    for(int i=0;i!=G.vexnum;++i){//初始化矩阵
     for(int j=0;j!=G.vexnum;++j){
            if(i==j)G.arcs[i][j].adj=0;
       else G.arcs[i][j].adj=10000;
        }
    }
char v1,v2;int w;
cout<<"Please enter "<>v1>>v2>>w;
    int i=locate(G,v1); int j=locate(G,v2);
    G.arcs[i][j].adj=w;
}
}

void printgraph(Mgraph M){
cout<<"\n"<<"The graph has "<>x;
int ix=locate(m,x);
cout<<"请输入终点";
cin>>y;
int iy=locate(m,y);

 cout<<" "<>"<

rebuf.txt:

3 5
a b c
a b 5
a c 11
b a 6
b c 2
c a 3

书上图7.36

运行结果:

C++代码,数据结构-最短路径(两种情况)(迪杰斯特拉算法和弗洛伊德算法)_第2张图片



你可能感兴趣的:(数据结构与算法(严蔚敏版))