#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;
}
实验七,迪杰斯特拉求最短路径
最新推荐文章于 2024-07-15 22:10:26 发布