【题目描述】
将一个图的所有节点分入两个子集,使横跨这两个子集的边的和最大值。
【解题思路】
随机改变一个点的位置,算出权和,重复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;
}
本文介绍了一种通过随机调整图中节点位置以寻找两个子集间最大权边集的算法实现。该方法适用于图划分问题,通过迭代地改变节点所属子集并计算边权总和来找到最优解。
(Network Saboteur )&spm=1001.2101.3001.5002&articleId=7487665&d=1&t=3&u=4881b6de8c8d456c9f69f32cf80585ae)
805

被折叠的 条评论
为什么被折叠?



