C++ Dijkstra算法 鄰接矩陣形式

圖在計算機內處理需要轉換成鄰接矩陣等矩陣類型
才能方便運算

​#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>

#define Inf 0x3f3f3f3f//最大值

using namespace std;

int map[1005][1005];//圖論的鄰接矩陣
int vis[1005];//標記,被標記的元素下次不能被使用
int dis[1005];//記錄移動
int n, m;//n代表結點	m表示邊

void init() {//初始化鄰接矩陣
	memset(&map, Inf, sizeof(map));
	for (int i = 1;i <= 1005;i++)
		map[i][i] = 0;//沒有環
}

inline int read() {//快速寫入
	int ff = 1;
	int ret = 0;
	char ch = getchar();
	while (!isdigit(ch)) {
		if (ch == '-') ff = -ff;
		ch = getchar();
	}
	while (isdigit(ch)) {
		ret = ret * 10 + ch - '0';
		ch = getchar();
	}
	return ff * ret;
}

void scanner() {//把圖寫入鄰接矩陣
	int u, v, x;
	for (int i = 1;i <= m;i++) {
		u = read(), v = read(), x = read();
		if (map[u][v] > x) {
			map[u][v] = x;
			map[v][u] = x;
		}
	}
}

/*測試數據
9 6
1 2 1
1 3 12
2 3 9
2 4 3
3 4 4
3 5 5
4 5 13
4 6 15
5 6 4

right printf-->17
*/

void Dijkstra(int n) {
	memset(vis, 0, sizeof(vis));//可忽略,全局變量已經初始化0
	for (int i = 1;i <= n;i++)
		dis[i] = map[n][i];//獲得最後一列(行)數據

	vis[n] = 1;//標記最後一個元素不能被使用
	for (int t = 1;t < n;t++) {
		int minn = Inf, temp;
		for(int i=1;i<=n;i++)
			if (!vis[i] && dis[i] < minn) {//判斷該元素能被使用且屬於最小值
				minn = dis[i];
				temp = i;
			}

		vis[temp] = 1;//標記該當前最小元素不能再被使用
		for (int i = 1;i <= n;i++)
		//被標記的元素+矩陣對應列(行)內的某個元素小於對應數據
			if (map[temp][i] + dis[temp] < dis[i])
				dis[i] = map[temp][i] + dis[temp];

	}
}

int main() {
	m = read(), n = read();
	init();
	scanner();
	Dijkstra(n);
	printf("%d", dis[1]);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章