[数据结构] 邻接矩阵实现Dijkstra算法

来源:互联网 发布:淘宝摄影师兼职招聘 编辑:程序博客网 时间:2024/04/29 15:01
#include <iostream>using namespace std; #define MAX_V 100 //定义最大顶点个数#define INF 1000 //表示正无穷 typedef struct VertexType{    int number;//顶点标号    //int weight;};//顶点类型typedef struct MGraph//图的定义{    int matrix[MAX_V][MAX_V];//邻接矩阵    int weight[MAX_V][MAX_V];//存放权值     int v;//顶点数int e;//边数    VertexType vertax[MAX_V];//存放顶点信息};//图的邻接矩阵类型void CreateMGragh(MGraph *G){int i,j,m,weight;cout << "请输入顶点数和边数:" << endl;cin >> G->v >> G->e ;cout << "请输入顶点信息:" << endl;for (i=0;i<G->v;i++)  scanf("%d",&G->vertax[i].number);//输入顶点信息,建立顶点表for (i=0;i<G->v;i++)//初始化邻接矩阵   for (j=0;j<G->v;j++)      {   G->matrix[i][j]=0;  G->weight[i][j]=INF;//让所有权值不存在       }    for(i=0;i<G->v;i++)//是结点自身指向自身权值为0   for(j=0;j<G->v;j++)    if(i==j)      G->weight[i][j]=0;cout << "输入每条有向边的首尾顶点序号及权值:" << endl;for (m=0;m<G->e;m++){cin >> i >> j >> weight;G->matrix[i][j]=1;G->weight[i][j]=weight;}}void DisplayMGragh(MGraph *G)//输出邻接矩阵G{    int i,j;    for(i=0;i<G->v;i++)    {        for(j=0;j<G->v;j++)          printf("%5d",G->matrix[i][j]);        printf("\n");    }}void DisplayMGragh_W(MGraph *G)//输出权值矩阵G{    int i,j;    for(i=0;i<G->v;i++)    {        for(j=0;j<G->v;j++)          printf("%5d",G->weight[i][j]);        printf("\n");    }}int MIN(int m,int n){if(m<=n)return m;elsereturn n;}void Dijkstra(MGraph *G)//对给定的有向图,求从源点1到其余每个顶点的最短路经长度 {int i,j,k;int choose,counter;int S[MAX_V];//存储顶点点集int P[MAX_V];//储存路径 memset(S,0,MAX_V);for(i=0;i<G->v;i++) //       P[i]=0;int D[MAX_V];//储存从源点到其余各顶点的最短路径距离 S[0]=1;//初始化第一个结点D[0]=0;//源点到源点距离为0    for(i=1;i<G->v;i++) //初始化D       D[i]=G->weight[0][i];    D[G->v]=INF;    cout << "初始化单源最短路径" <<endl; for(i=0;i<G->v;i++) //       printf("%5d\n",D[i]);    printf("\n");    for(i=1;i<=G->v-1;i++){choose = D[G->v];for(j=1;j<G->v;j++)//寻找最短路径V-S {if((S[j]!=1)&&(choose>D[j])){  choose = D[j];  counter = j;}}S[counter]=1;//将顶点j加入S中 for (j=1;j<G->v;j++){if(S[j]!=1){if(D[counter]+G->weight[counter][j]<D[j])  P[j]=counter;D[j]=MIN(D[j],D[counter]+G->weight[counter][j]);}}}          cout << "各顶点的单源最短路径" <<endl;for(k=1;k<G->v;k++) //       printf("%5d\n",D[k]);          cout <<endl;    cout << "回退矩阵"<<endl; for(k=0;k<G->v;k++) //       printf("%5d\n",P[k]);        cout << "输入最短路径点:"<< endl;cin >> i ;printf("%d ",i);while(P[i]!=0) {printf("%d ",P[i]);i = P[i];}printf("0");}int main(){struct MGraph *G;G = new MGraph;CreateMGragh(G);cout << "显示邻接矩阵" <<endl; DisplayMGragh(G);cout << "显示权值矩阵" <<endl; DisplayMGragh_W(G);Dijkstra(G);delete G;return 0;}
0 0
原创粉丝点击