最短路径问题,使用 Floyd算法。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 105;
const int INF = 10000000;
int N, M;
int mp[MAXN][MAXN]; //两点间的最短距离(不经过中间点)
int dis[MAXN][MAXN]; //两点间的最短距离(经过中间点)
//Floyd算法
void Floyd()
{
int ans = INF;
for (int k = 1; k <= N; k++)
{
for (int i = 1; i < k; i++)
{
for (int j = i + 1; j < k; j++)
{
ans = min(ans, mp[i][k] + mp[k][j] + dis[i][j]);
}
}
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
if (ans != INF)
{
printf("%d\n", ans);
}
else
{
printf("It's impossible.\n");
}
}
int main()
{
while (scanf("%d %d", &N, &M) != EOF)
{
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
mp[i][j] = dis[i][j] = (i == j ? 0 : INF);
}
}
int a, b, c;
for (int i = 0; i < M; i++)
{
scanf("%d %d %d", &a, &b, &c);
mp[a][b] = mp[b][a] = dis[a][b] = dis[b][a] = min(mp[a][b], c);
}
Floyd();
}
return 0;
}
继续加油。