最短路径算法——邻接距阵

#define INF 99999

typedef struct Graphic{
	int size;
	int **matrix;
};

/***************  最短路径  ***************/
//start指起点,
//dist[i]记录源点到i点的最短路径
//prev[i]记录在特殊路径当中i点的前一个点
//Graphic *g就是无向图的结构体(邻接矩阵)
void Dijkstra(int start,int dist[],int prev[], Graphic *g){
    int i,j, min;
	int size = g->size;
	int **cost = g->matrix;
	bool *visited = new bool[size];

	for (i=0;i<size;++i){
        dist[i] = INF;
        visited[i] = false;
		prev[i] = dist[i]==INF ? -1 : start;
    }

	//初始时从源点出发
	dist[start] = 0; visited[start] = true;

	for (i=0; i<size-1; ++i){
		min = INF;
		int u = start;

		for (j=0;j<size;++j){
		  if ((!visited[j])&&(dist[j]<min)){
				u = j;
				min = dist[j];
		   }
		}

		visited[u] = true;

		for (j=0; j<size; ++j){
			if ((!visited[j])&&cost[u][j]<INF){
				//distance为从源点到该点的最短路径
				int distance = dist[u] + cost[u][j];

				if (distance<dist[j]){
					dist[j] = distance;
					prev[j] = u;
				}
			}
		}
	}
	 
	//释放空间
	delete visited;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值