【题目描述】
将一个图的所有节点分入两个子集,使横跨这两个子集的边的和最大值。
【解题思路】
随机改变一个点的位置,算出权和,重复200000次,取最大值输出。
int part[31], my_map[31][31];
int n;
int main()
{
while (scanf("%d", &n) == 1) {
int i, j;
for (i = 1; i <= n; ++i) {
for (j = 1; j <= n; ++j) {
scanf("%d", &my_map[i][j]);
}
}
memset(part, 0, sizeof(part));
int sum = 0, max = -1;
int t = 500000;
while (t--) {
int a = rand() % n + 1;
part[a] = 1 - part[a];
for (i = 1; i <= n; ++i) {
if (i == a) continue;
if (part[i] == part[a]) sum -= my_map[i][a];
else sum += my_map[i][a];
}
if (sum > max)
max = sum;
}
printf("%d\n", max);
}
return 0;
}