作业2———Floyd Dijkstra 算法求最短路径

1.问题

Floyd 和 dijkstra算法求无向图中两点间的最短距离。

2.解析

Floyd:输入一个加权连通图,遍历图中每个点,尝试图中每两个点能否通过另一点得到更短的距离,循环结束新生成的图为每两个点之间的最短距离。

Dijkstra:输入一个加权连通图和一个起始点start,已访问点集visit[]={false},起始点已访问,第一次循环从其它点中找到距离起始点最近的点x,记录其它点到起始点的最短距离的集合mindist[]=. 记录mindist[x],visit[x]=true, 检查其他点能否通过x得到与起始点更近的距离,第一次循环结束。下一次循环从剩下visit[] = false的点中找到mindist [x1],再检查其他点能否通过x1得到与起始点更近的距离。。。。。。循环n次得到mindist [i],为点i到起始点的最近距离。

3.设计

Int floyd(){
For(k from 1 to MAX){
For(i from 1 to MAX){
For(j from 1 to MAX){
Graph[i][j] = min(Graph[i][j], Graph[i][k]+Graph[k][j]);
}
}
}
}

Int dijkstra(int start ){
For(i from 1 to MAX) dist[i] = Graph[start][i]
For(k from 1 to MAX){
For(i from 1 to MAX){
If(!visit[i]) find min dist[i];i = k;
}
Visit[k] = true;
For (j from 1 to MAX){
Dist[j] = min(dist[j], dist[k] + Graph[k][j]);
}
}
}

4.分析

Floyd:时间复杂度:O(n^3) 空间复杂度:O(n)
Dijkstra:时间复杂度:O(n^2) 空间复杂度:O(n)

5.源码

#include
#include
#include
#define MAX 4
#define MAXCOST 10000
#define inf 0x3f3f3f3f
	
void djkstra(int Graph[][MAX],int start) {
	int dist[MAX];
	bool visited[MAX] = {false};
	visited[start] = true;

	for (int i = 0; i < MAX; i++) {
      dist[i] = Graph[start][i];
	}
	
	for (int m = 0; m < MAX; m++) {
	  int min = MAXCOST;
	  int k = 0;
		for (int i = 0; i < MAX; i++) {
			if (!visited[i] && dist[i] < min )
				k = i;
		}
		visited[k] = true;
		for (int j = 0; j < MAX; j++) {
			if (dist[j] > dist[k] + Graph[k][j])
				dist[j] = dist[k] + Graph[k][j];
	   }
	}
	for (int i = 0; i < MAX; i++) {
		printf("dist[%d] = %d\n",i, dist[i]);
	}
}

void floyd(int Graph[][MAX]) {
	for (int k = 0; k < MAX; k++) {
		for (int i = 0; i < MAX; i++) {
			for (int j = 0; j < MAX; j++) {
				if (Graph[i][j] > Graph[i][k] + Graph[k][j])
					Graph[i][j] = Graph[i][k] + Graph[k][j];
			}
		}
	}
	for (int i = 0; i < MAX; i++) {
		for (int j = 0; j < MAX; j++) {
			if (i < j) {
				printf("%d到%d最短距离: %d\n", i, j, Graph[i][j]);
			}
		}
	}
}
int main() {
	int Graph[MAX][MAX];
	memset(Graph, 0x3f3f3f3f, sizeof(Graph));
	for (int i = 0; i < MAX;i++) {
		for (int j = 0; j < MAX;j++) {
			if (i == j) Graph[i][j] = 0;
		}
	}
	int m;
	scanf_s("%d", &m);//输入图的边数
	while (m--) {
		int i, j, w;
		scanf_s("%d%d%d", &i, &j, &w);//输入连接两条边的点 和权值
		Graph[i][j] = Graph[j][i] = w;
	}
	floyd(Graph);
	return 0;
}


你可能感兴趣的:(作业2———Floyd Dijkstra 算法求最短路径)