решение8

advertisement
Разбор.
Если перевести эту задачу на язык графов, то получится такая задача: имеется
неориентированный связный орграф, в нем необходимо найти такую вершину, что расстояние от
нее до всех остальных минимально. Для этого нам понадобиться знать кратчайшее расстояние
между всеми парами вершин. Это можно узнать, запустив для каждой вершины алгоритм
Дейкстры или написать алгоритм Флойда. Естественно, что мы будем делать последнее, так как
при одинаковой асимптотике объем кода Флойда будет в разы меньше. Найдя эти самые
расстояния, будем суммировать их для каждой вершины и находить минимум, параллельно
фиксируя номер вершин. Как видно, задача проста.
Решение на С++
#include <iostream>
#include <algorithm>
using namespace std;
int inf = 1000000;
// бесконечность
int mass[100][100];
//матрица смежности
и одновременно матрица кратчайших
//расстояний
int n, m, ans;
// алгоритм
void Floyd()
{
for (int k = 0; k < n; ++k)
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
mass[i][j] = min(mass[i][j], mass[i][k] + mass[k][j]);
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
mass[i][j] = inf;
for (int i = 0; i < n; ++i)
mass[i][i] = 0;
for (int i = 0; i < m; ++i)
{
int fr, to;
cin >> fr >> to;
fr--; to--;
cin >> mass[fr][to];
mass[to][fr] = mass[fr][to];
}
Floyd();
ans = 0;
int sum = 1001 * inf;
for (int i = 0; i < n; ++i)
{
int sum1 = 0;
for (int j = 0; j < n; ++j)
sum1+= mass[i][j];
if (sum1 < sum)
{
sum = sum1;
ans = i+1;
}
}
cout << ans << " " << sum * 2;//выводим удвоенную сумму, так как
1
//Диме придется постоянно возвращаться за мешком
return 0;
}
2
Download