Floyd最短路:
/*
16 14 79
11 5 63
3 19 26
13 12 41
14 7 28
15 3 7
4 5 18
20 7 43
10 16 38
8 4 55
1 12 100
6 5 10
7 6 78
18 7 77
19 16 6
12 18 47
2 3 63
9 19 17
17 2 100
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 1e2;
int f[N][N];
int main()
{
memset(f, 0x3f, sizeof f);
for (int i = 0; i < 19; i++)
{
int x, y, z;
cin >> x >> y >> z;
f[x][y] = f[y][x] = z;
}
int n = 20;
for (int k = 1; k <= n; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
f[i][j] = min(f[i][k] + f[k][j], f[i][j]);
}
}
}
int sum = 0;
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
{
sum += f[i][j];
}
}
cout << sum << endl;
return 0;
}
Dijkstra最短路:
/*
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
*/
#include <iostream>
#include <cstring>
using namespace std;
int e[10][10];
int dis[10];
int vis[10];
int main()
{
int n, m, u, v;
cin >> n >> m;
//初始化
memset(e, 0x3f, sizeof(e));
for (int i = 1; i <= n; i++)
{
e[i][i] = 0;
}
int t1, t2, t3;
for (int i = 1; i <= m; i++)
{
cin >> t1 >> t2 >> t3;
e[t1][t2] = t3;
}
//初始化dis数组,这是1号顶点到其余各顶点的初始路程
for (int i = 1; i <= n; i++)
{
dis[i] = e[1][i];
}
vis[1] = 1;
//Dijkstra算法核心
for (int i = 1; i <= n - 1; i++)
{
int now_min = 0x3f3f3f3f;
for (int j = 1; j <= n; j++)
{
if (!vis[j] && dis[j] < now_min)
{
now_min = dis[j];
u = j;
}
}
vis[u] = 1;
for (v = 1; v <= n; v++)
{
dis[v] = min(dis[u] + e[u][v], dis[v]);
}
}
for (int i = 1; i <= n; i++)
{
cout << dis[i] << " ";
}
return 0;
}