数据结构 djskstra 算法

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

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章线性代数方程组的解法 1.全主元高斯约当消去法 2.LU分解法 3.追赶法 4.五对角线性方程组解法 5.线性方程组解的迭代改善 6.范德蒙方程组解法 7.托伯利兹方程组解法 8.奇异值分解 9.线性方程组的共轭梯度法 10.对称方程组的乔列斯基分解法 11.矩阵的QR分解 12.松弛迭代法 第2章插值 1.拉格朗日插值 2.有理函数插值 3.三次样条插值 4.有序表的检索法 5.插值多项式 6.二元拉格朗日插值 7.双三次样条插值 第3章数值积分 1.梯形求积法 2.辛普森求积法 3.龙贝格求积法 4.反常积分 5.高斯求积法 6.三重积分 第4章特殊函数 1.г函数、贝塔函数、阶乘及二项式系数 2.不完全г函数、误差函数 3.不完全贝塔函数 4.零阶、一阶和任意整数阶的第一、二类贝赛函数 5.零阶、一阶和任意整数阶的第一、二类变形贝赛函数 6.分数阶第一类贝赛尔函数和变形贝赛尔函数 7.指数积分和定指数积分 8.连带勒让德函数 第5章函数逼近 1.级数求和 2.多项式和有理函数 3.切比雪夫逼近 4.积分和导数的切比雪夫逼近 5.有切比雪夫逼近函数的多项式逼近 第6章特征值问题 1.对称矩阵的雅可比变换 2.变实对称矩阵为三对角对称矩阵 3.三对角矩阵的特征值和特征向量 4.变一般矩阵为赫申伯格矩阵 5.实赫申伯格矩阵的QR算法 第7章数据拟合 1.直线拟合 2.线性最小二乘法 3.非线性最小二乘法 4.绝对值偏差最小的直线拟合 第8章方程求根和非线性方程组的解法 1.图解法 2.逐步扫描法和二分法 3.割线法和试位法 4.布伦特方法 5.牛顿拉斐森法 6.求复系数多项式根的拉盖尔方法 7.求实系数多项式根的贝尔斯托方法 8.非线性方程组的牛顿拉斐斯方法 第9章函数的极值和最优化 1.黄金分割搜索法 2.不用导数的布伦特法 3.用导数的布伦特法 4.多元函数的下山单纯形法 5.多元函数的包维尔法 6.多元函数的共轭梯度法 7.多元函数的变尺度法 8.线性规划的单纯形法 第10章傅里叶变换谱方法 1.复数据快速傅里叶变换算法 2.实数据快速傅里叶变换算法一 3.实数据快速傅里叶变换算法二 4.快速正弦变换和余弦变换 5.卷积和逆卷积的快速算法 6.离散相关和自相关的快速算法 7.多维快速傅里叶变换算法 第11章数据的统计描述 1.分布的矩——均值、平均差、标准差、方差、斜差和峰态 2.中位数的搜索 3.均值与方差的显著性检验 4.分布拟合的X平方检验 5.分布拟合的K-S检验法 第12章解常微分方程组 1.定步长四阶龙格库塔法 2.自适应变步长的龙格库塔法 3.改进的中点法 4.外推法 第13章偏微分方程的解法 1.解边值问题的松驰法 2.交替方向隐式方法 这些算法将为千千万万非计算机专业的工程技术人员架起一座方便快捷的桥梁, 并能缩短应用软件的编制周期,减少重复劳动,达到事业功倍的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值