图的结构建立和最短路径算法
来源:互联网 发布: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
- 图的结构建立和最短路径算法
- 图结构 最短路径 Floyd算法
- 图的最短路径dijkstra算法
- 图的最短路径算法
- 图的最短路径算法
- 图的最短路径-Prim算法
- 图的最短路径算法
- 图的最短路径算法
- Dijkstra算法--图的最短路径
- 图的最短路径算法
- 图结构练习——最短路径 dijkstra算法
- 最短路径下的Dijkstra算法和Floyd算法
- 【图】最短路径Dijkstra算法和Floyd算法
- 无权图的单源最短路径最短路径算法
- 最简单的最短路径算法
- 【图的最短路径】迪杰斯特拉算法求图的最短路径
- 图的最短路径算法(二)-任意节点最短路径
- 图的最短路径(三)-单源点最短路径(Dijkstra算法)
- java异常基础知识
- block小解
- 菜鸟系列——欧拉函数
- 斯坦福iOS7 2013-2014秋Assignment 6的一种答案 #2
- 写给菜鸟:发CSDN博文常见问题处理
- 图的结构建立和最短路径算法
- NSMutableDictionary
- 递归
- Linux系统编程---记录终端输入的命令
- WOJ-1167
- netbeans中的小知识
- 【JAVA面试题】之四:Java序列化
- 面试编程题
- system V与systemd