数据结构 djskstra 算法

来源:互联网 发布:数据挖掘软件有哪些 编辑:程序博客网 时间:2024/04/29 13:25

//这里我给出代码。算法思想。需要自己去理解。我自己就是新手。我掌握就是先会画图。理解思想。接着就去理解代码。吃透代码。

#include <stdio.h>
#define INFINITY  65535
#define MAXVEX  10
typedef struct 
{
char vertexs[MAXVEX];
int arc[MAXVEX][MAXVEX];
int vexnum,arcnum;
}GraphType;
void Create(GraphType*);//创建
int Located(GraphType*,char);
void Dijkstra(GraphType*G,int*P,int*D,int v0);
int main(void)
{
GraphType G;
int P[MAXVEX],D[MAXVEX],val;
char v0;
Create(&G);
printf("请输入你要开始的定点:");
scanf("\n%c",&v0);
val=Located(&G,v0);
Dijkstra(&G,P,D,val);
return 0;
}
int Located(GraphType*G,char v)
{
int i,k=-1;
for(i=0;i<G->vexnum;i++)
{
if(v==G->vertexs[i])
{
k=i;
break;
}
}
return k;
}
void Create(GraphType*G)
{
int i,j,v,w,weight;
char m,n;
printf("请输入你要顶点个数和边数");
scanf("%d %d",&G->vexnum,&G->arcnum);
printf("亲输入顶点信息:");
for(i=0;i<G->vexnum;i++)
scanf("\n%c",&(G->vertexs[i]));
for(i=0;i<G->vexnum;i++)//初始化
for(j=0;j<G->vexnum;j++)
{
if(i==j)
G->arc[i][j]=0;
else
G->arc[i][j]=INFINITY;
}
printf("亲输入相关联的顶点及其他们的直接的权值:");
for(i=0;i<G->arcnum;i++)
{
scanf("\n%c,%c,%d",&m,&n,&weight);
v=Located(G,m);
w=Located(G,n);
G->arc[v][w]=weight;
G->arc[w][v]=weight;
}
for(i=0;i<G->vexnum;i++)
{
for(j=0;j<G->vexnum;j++)
printf("%6d ",G->arc[i][j]);
printf("\n");


}
return ;
}
void Dijkstra(GraphType*G,int*P,int*D,int v0)
{
//P[w]表示v0到w前驱节点的下标
//D[w]表示v到w最短路径的权值和
//final[W]=1表示v0到w有最短路径。
int v,w,k,min,final[MAXVEX],pre;
for(v=0;v<G->vexnum;v++)
{
final[v]=0;//表示初始v0到全部顶点的最短路径位置状态。
D[v]=G->arc[v0][v];//表示v0点有连线的顶点加上权值:
P[v]=0;
}
D[v0]=0;//v0哒v0的最短路径为0.
final[v0]=1;//v0与v0不需要求最短路径。
for(v=1;v<G->vexnum;v++)//开始主循环。找到除了v0以外的其他点点。
{
min=INFINITY;
for(w=0;w<G->vexnum;w++)//寻找v0最近的点点
{
if(!final[w]&&D[w]<min)//前提是对其他没有访问的点点!final[w]同时还是距离最近的点点
{
min=D[w];//min保存最短的距离
k=w;//用来记录最近点点的下标
}
}
final[k]=1;//与最近的点点有了最短路径。
for(w=0;w<G->vexnum;w++)//修正当前最短的距离
{//如果经过v点的距离比现在D[W]存储的距离还短的话,就更新D[w]
if(!final[w]&&G->arc[k][w]<INFINITY&&min+G->arc[k][w]<D[w])//防止溢出。判断一下G->arc[k][w]<INFINITY
//说明找到了更短的距离。
{
D[w]=min+G->arc[k][w];
P[w]=k;//纳闷此时我们p[W]的前驱下标就是距离最近的点点k的下标
}
}
}
for(w=0;w<G->vexnum;w++)
{

//printf("P[%d] ",P[w]);
if(w!=v0)
{
printf("P[%d] ",P[w]);
printf("%c->%c的最短路径 weight: %d\n",G->vertexs[v0],G->vertexs[w],D[w]);
printf("路径%c",G->vertexs[w]);//尾节点顶点
pre=P[w];//每次pre就是每次开始顶点的前驱。
while(pre!=0)
{
printf("《-%c",G->vertexs[pre]);
pre=P[pre];
}
printf("《-%c",G->vertexs[v0]);//输出源节点顶点
printf("\n");
}
}
return ;
}

0 0
原创粉丝点击