POJ-2531(随机化 or dfs)(Network Saboteur )

来源:互联网 发布:mac zip解压软件 编辑:程序博客网 时间:2024/04/29 06:47

【题目描述】

将一个图的所有节点分入两个子集,使横跨这两个子集的边的和最大值。

【解题思路】

随机改变一个点的位置,算出权和,重复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;}

原创粉丝点击