图的结构建立和最短路径算法

来源:互联网 发布:it桔子网 编辑:程序博客网 时间:2024/05/19 23:15

问题描述:利用邻接矩阵构造图,并求出某一顶点到其余顶点的最短路径并打印输出。

#include<stdio.h>#include<string.h>#define MAX_VERTEX_NUM 50#define FALSE 0#define TRUE 1#define INFINITY 100000typedef struct {char vexs[MAX_VERTEX_NUM][100];int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];int vexnum, arcnum;    //分别为结点数和路径数}MGraph;//寻找结点模块:int Location(MGraph G,char ch[]){int i;for(i=0;i<G.vexnum;i++){if(!strcmp(G.vexs[i],ch)){break;}}return i;}//构建图模块:int Create(MGraph &G,int n){int i,j,k,w;char v1[100],v2[100];printf("请分别输入顶点和路径的的个数:\n");scanf("%d%d",&G.vexnum,&G.arcnum);for(i=0;i<G.vexnum;++i){for(j=0;j<G.vexnum;++j){G.arcs[i][j]=INFINITY;}}printf("请输入%d个顶点:\n",G.vexnum);for(k=0;k<G.vexnum;k++){scanf("%s",G.vexs[k]);}for(k=0;k<G.arcnum;++k){printf("请输入第%d条弧上的两个顶点以及弧的权值:\n",k+1);scanf("%s%s%d",v1,v2,&w);i=Location(G,v1);//寻找出路径上前后两个结点在邻接矩阵中的存储位置j=Location(G,v2);G.arcs[i][j]=w;if(n==2){G.arcs[j][i]=w;}}return 0;}//寻找最短路径模块:void ShortestPath(MGraph G,int v0,int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM],int D[]){int v,w,i,k,min,final[MAX_VERTEX_NUM];for(v=0;v<G.vexnum;++v){final[v]=FALSE;D[v]=G.arcs[v0][v];for(w=0;w<G.vexnum;++w){P[v][w]=FALSE;}if(D[v]<INFINITY){P[v][v0]=TRUE;P[v][v]=TRUE;}}D[v0]=0;final[v0]=TRUE;P[v0][v0]=TRUE;for(i=1;i<G.vexnum;++i){min=INFINITY;for(w=0;w<G.vexnum;++w){if(!final[w]){if(D[w]<min){v=w;min=D[w];}}}final[v]=TRUE;for(w=0;w<G.vexnum;++w){if(!final[w]&&(min+G.arcs[v][w]<D[w])){D[w]=min+G.arcs[v][w];for(k=0;k<G.vexnum;k++){P[w][k]=P[v][k];}P[w][w]=TRUE;}}}}//主程序模块:int main(){MGraph G;char v0[100];int i,j,m=1,k,n,P[MAX_VERTEX_NUM][MAX_VERTEX_NUM],D[MAX_VERTEX_NUM];printf("**************************->欢迎使用<-****************************\n\n");while(m!=0){printf("有向图输入1;无向图输入2;");scanf("%d",&n);    Create(G,n);    printf("起始点为:\n");    scanf("%s",v0);    k=Location(G,v0);    ShortestPath(G,k,P,D);    for(i=0;i<G.vexnum;++i){    printf("%s->%s",G.vexs[k],G.vexs[i]);    if(D[i]==INFINITY){    printf("无路径\n");}    else{    printf("路径为:");    printf("<");    for(j=0;j<G.vexnum;j++){    if(P[i][j]==TRUE){    printf("%s->",G.vexs[j]);} }    printf("\b\b");    printf(">");    printf("路径长度为%d",D[i]);    printf("\n");}}printf("输入0退出系统,输入1继续运行:");scanf("%d",&m);}printf("*************************谢谢使用!***************************\n");return 0;}


0 0
原创粉丝点击