最短路径代码 -- Dijkstra

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[j] == 1 && i != v)
		{
			cout << "从顶点" << v << "到顶点" << i << "的路径长度为" << dist[i] << "\t路径为:";
			d = 0;  //顶点数置0
			apath[d] = i;  //添加路径上的结点
			k = path[i];
			if (k == -1)
				cout << "无路径" << endl;
			else
			{
				while (k != v)
				{
					d++;
					apath[d] = k;
					k = path[k];
				}
				d++; //添加路径上的结点
				apath[d] = v;
				cout << apath[d]; //起点
				for (j = d - 1; j >= 0; j--) //逆向 输出其他顶点
					cout << apath[j];
				cout << endl;
			}
		}
}

void Dijkstra(MatGraph g, int v)
{
	int dist[MAXV], path[MAXV];
	int S[MAXV];  //1表示在S中,0表示在U中
	int MINdis;
	int i, j, u;
	for (i = 0; i < g.n; i++)
	{
		dist[i] = g.edges[v][i]; //距离初始化
		S[i] = 0;  //在U中
		if (g.edges[v][i] < INF)
			path[i] = v;   //能到达的(有边相连的) 置为邻接点下标
		else
			path[i] = -1; //无边相连,置为-1
	}
	S[v] = 1; //源点置S中
	path[v] = 0;  //本身置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]; //MINdis记录最短的
			}
		S[u] = 1; //放S中
		for (j = 0; j < g.n; j++) //修改U中最短路径 把该列小的更新掉dist
			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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值