#include <stdio.h> #include <malloc.h> #define INF 32767 #define MAXV 100 typedef char InfoType; typedef struct { int no; InfoType info; } VertexType; typedef struct { int edges[MAXV][MAXV]; int n,e; VertexType vexs[MAXV]; } MatGraph; typedef struct ANode { int adjvex; struct ANode *nextarc; int weight; } ArcNode; typedef struct Vnode { InfoType info; int count; ArcNode *firstarc; } VNode; typedef struct { VNode adjlist[MAXV]; int n,e; } AdjGraph; void CreateMat(MatGraph &g,int A[MAXV][MAXV],int n,int e) { int i,j; g.n=n; g.e=e; for (i=0;i<g.n;i++) for (j=0;j<g.n;j++) g.edges[i][j]=A[i][j]; } void DispMat(MatGraph g) { int i,j; for (i=0;i<g.n;i++) { for (j=0;j<g.n;j++) if (g.edges[i][j]!=INF) printf("%4d",g.edges[i][j]); else printf("%4s","∞"); printf("\n"); } } void CreateAdj(AdjGraph *&G,int A[MAXV][MAXV],int n,int e) { int i,j; ArcNode *p; G=(AdjGraph *)malloc(sizeof(AdjGraph)); for (i=0;i<n;i++) G->adjlist[i].firstarc=NULL; for (i=0;i<n;i++) for (j=n-1;j>=0;j--) if (A[i][j]!=0 && A[i][j]!=INF) { p=(ArcNode *)malloc(sizeof(ArcNode)); p->adjvex=j; p->weight=A[i][j]; p->nextarc=G->adjlist[i].firstarc; G->adjlist[i].firstarc=p; } G->n=n; G->e=n; } void DispAdj(AdjGraph *G) { ArcNode *p; for (int i=0;i<G->n;i++) { p=G->adjlist[i].firstarc; printf("%3d: ",i); while (p!=NULL) { printf("%3d[%d]→",p->adjvex,p->weight); p=p->nextarc; } printf("∧\n"); } } void DestroyAdj(AdjGraph *&G) { ArcNode *pre,*p; for (int i=0;i<G->n;i++) { pre=G->adjlist[i].firstarc; if (pre!=NULL) { p=pre->nextarc; while (p!=NULL) { free(pre); pre=p; p=p->nextarc; } free(pre); } } free(G); } void Dispath(MatGraph g,int dist[],int path[],int S[],int v) { int i,j,k; int apath[MAXV],d; for (i=0;i<g.n;i++) if (S[i]==1 && i!=v) { printf(" 从顶点%d到顶点%d的路径长度为:%d\t路径为:",v,i,dist[i]); d=0; apath[d]=i; k=path[i]; if (k==-1) printf("无路径\n"); else { while (k!=v) { d++; apath[d]=k; k=path[k]; } d++; apath[d]=v; printf("%d",apath[d]); for (j=d-1;j>=0;j--) printf(",%d",apath[j]); printf("\n"); } } } void Dijkstra(MatGraph g,int v) { int dist[MAXV],path[MAXV]; int S[MAXV]; int Mindis,i,j,u; for (i=0;i<g.n;i++) { dist[i]=g.edges[v][i]; S[i]=0; if (g.edges[v][i]<INF) path[i]=v; else path[i]=-1; } S[v]=1;path[v]=0; for (i=0;i<g.n-1;i++) { Mindis=INF; for (j=0;j<g.n;j++) if (S[j]==0 && dist[j]<Mindis) { u=j; Mindis=dist[j]; } S[u]=1; for (j=0;j<g.n;j++) if (S[j]==0) if (g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j]) { dist[j]=dist[u]+g.edges[u][j]; path[j]=u; } } Dispath(g,dist,path,S,v); } |
int main() { int v=0; MatGraph g; int A[MAXV][MAXV]={ {0,5,INF,7,INF,INF}, {INF,0,4,INF,INF,INF}, {8,INF,0,INF,INF,9}, {INF,INF,5,0,INF,6}, {INF,INF,INF,5,0,INF}, {3,INF,INF,INF,1,0}}; int n=6, e=10; CreateMat(g,A,n,e); printf("有向图G的邻接矩阵:\n"); DispMat(g); printf("狄克斯特拉算法求解结果:\n"); Dijkstra(g,v); return 1; } |
c++实现迪杰斯特拉求最短路径
最新推荐文章于 2024-08-19 12:02:02 发布
文章详细讲解了如何用C代码执行Dijkstra算法在有向图中找到两点之间的最短路径,包括创建邻接矩阵和显示搜索结果。
摘要由CSDN通过智能技术生成