题目
要在一个5x5的矩阵形状的城市里建立5个政府办公室。要求到达最近的办公室的距离(哈密顿距离)和最小(每个人权值为1)。
分析
搜索。回溯求解,记录最小值即可。
说明
开始以为是贪心(⊙o⊙)…
#include <stdio.h>
#include <stdlib.h>
int square[5][5];
int ans = 1250000;
int save[5], output[5];
int dfs(int v, int d)
{
if (d >= 5) {
int sum = 0, val = 0;
for (int r = 0; r < 5; ++ r) {
for (int c = 0; c < 5; ++ c) {
int add = 12500;
for (int i = 0; i < 5; ++ i) {
val = (abs(save[i]/5 - r) + abs(save[i]%5 - c))*square[r][c];
if (add > val) {
add = val;
}
}
sum += add;
}
}
if (ans > sum) {
ans = sum;
for (int i = 0; i < 5; ++ i) {
output[i] = save[i];
}
}
return 0;
}
for (int i = v; i < 25; ++ i) {
save[d] = i;
dfs(i+1, d+1);
}
return 0;
}
int main()
{
int t, n, r, c, p;
while (~scanf("%d", &t))
while (t --) {
scanf("%d", &n);
for (int i = 0; i < 5; ++ i) {
for (int j = 0; j < 5; ++ j) {
square[i][j] = 0;
}
}
for (int i = 0; i < n; ++ i) {
scanf("%d%d%d", &r, &c, &p);
square[r][c] = p;
}
ans = 1250000;
dfs(0, 0);
printf("%d", output[0]);
for (int i = 1; i < 5; ++ i) {
printf(" %d", output[i]);
}
puts("");
}
return 0;
}