圖在計算機內處理需要轉換成鄰接矩陣等矩陣類型
才能方便運算
#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;
}