杭电1874——Dijkstra(迪杰斯特拉)最短路径
原题传送门
迪杰斯特拉模板可以过,代码借鉴的是一个大佬的CSDN博客,不过后来整丢了,我的代码是我一个字母一个字母敲出来的,特在此注明。
杭电1874弗洛伊德代码
# include <iostream>
# include <algorithm>
# include <cstring>
using namespace std;
const int maxn = 1e7;
int mapp[205][205], vis[205], len[205];
int main() {
int n, m, a, b, x, s, t;
while (cin >> n >> m) {
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
mapp[i][j] = i == j ? 0 : maxn;
}
len[i] = maxn;
}
for (int i = 0; i < m; i++) {
cin >> a >> b >> x;
if (mapp[a][b] > x) {
mapp[a][b] = mapp[b][a] = x;
}
}
cin >> s >> t;
for (int i = 0; i < n; i++) {
len[i] = mapp[s][i];
}
vis[s] = 1;
while (1) {
int minn = maxn;
int k = -1;
for (int i = 0; i < n; i ++ ) {
if (vis[i] == 0 && minn > len[i]) {
minn = len[i];
k = i;
}
}
if (k == -1) {
break;
}
vis[k] = 1;
for (int i = 0; i < n; i++) {
if (vis[i]==0 &&len[i] > len[k] + mapp[k][i]) {
len[i] = len[k] + mapp[k][i];
}
}
}
if (len[t] == maxn) {
cout << -1 << endl;
}
else {
cout << len[t] << endl;
}
}
return 0;
}
大佬的源码(有一点注释):
#include<stdio.h>
int mm[205][205];
int vis[205], len[205];
const int MAX = 0xfffffff;
int main() {
int N, M;
int a, b, x;
int s, t;
while (~scanf("%d%d", &N, &M)) {
for (int i = 0; i < N; i++) {
vis[i] = 0; //所有城市标记为未访问
len[i] = MAX; //所有路径标记为无穷大
}
for (int i = 0; i < N; i++) {//数组初始化
for (int j = 0; j < N; j++) {
mm[i][j] = i == j ? 0 : MAX;
}
}
for (int i = 0; i < M; i++) {//数据输入
scanf("%d%d%d", &a, &b, &x);
if (mm[a][b] > x) {
mm[a][b] = mm[b][a] = x;
}
}
scanf("%d%d", &s, &t);
//dijkstra算法
for (int i = 0; i < N; i++) {//用于初始化标记s到i的距离
len[i] = mm[s][i];
}
vis[s] = 1;//出发城市标记为已访问
while (1) {
int min = MAX;
int k = -1;
for (int i = 0; i < N; i++) {//寻找下一个城市(路最短)
if (vis[i] == 0 && len[i] < min) {
min = len[i];
k = i;
}
}
if (k < 0) break;//所有城市都被标记完了
vis[k] = 1;
for (int i = 0; i < N; i++) {
if (vis[i] == 0 && len[i] > len[k] + mm[k][i]) {
len[i] = len[k] + mm[k][i];
}
}
}
printf("%d\n", len[t] == MAX ? -1 : len[t]);
}
return 0;
}