最短路径(迪杰斯特拉求法)

具体思路 就是根据 与点相连接的 最短的边来产生路径;既 开始从某个特定的顶点出发

具体步骤:
1 首先 生成俩个 数组 ,一个用来存放这个邻接矩阵的权值 一个用来生成 这个点与所有点的需要费用,然后 给 保存这个权值的数组 赋值最开始 的与这个点连接的 邻接 表的 值,然后用循环遍历 这些点中的最小的权值既点的坐标 ,然后以这个坐标为单位继续找出与这个 与这个坐标相连接的 点的最小值,一直找到 最小值为无穷大的时候 由这个点到这个图中所有点的最短路径就生成了;

int pre[n] ;// 用来保存与这个点相连接的最短路径的权值
int p[n][n]; //用来保存这个图的邻接矩阵
void djex(int x, int n) // x为起始点  ,n为顶点的大小
{  int i, j, k, min;
   int final[1005];
   for (i = 1; i <= n; i++)
   {
		pre[i] = p[x][i]; //初始化权值的数组 设置为由起始点所到各个点的权值
		final[i] = 0;  // 初始化标记  此标记用于看看点是否 连接进去
     }
          pre[x] = 0;  //自己到自己权值为0
	final[x] = 1; // 已经连接进去 设置为1
	for (i = 1; i < n; ++i)
	{
		min = INF; 
		k = x;
		for (j = 1; j <= n; j++)
			if (!final[j] && pre[j] < min)  //找出与这个点连接的权值最小的边
			{
				k = j;
				min = pre[j];
			}
		if (min == INF)    //  最小值为无穷 那么 已经没有和他连接的点了 直接退出
			break;
		final[k] = 1;     //  把这个点也标记一下
		for (j = 1; j <= n; j++)
			if (!final[j] && pre[k] + p[k][j] < pre[j])  // 找出 与刚刚找到的最小的边 相连接的 边 存如权值数组
			{
				pre[j] = pre[k] + p[k][j];
			}
	     }
	    printf("%d",pre[n]);  // 既输出 从点 x->n 的最短路径
      }   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值