POJ 2531 Network Saboteur(DFS)
POJ 2531 Network Saboteur
题意
把 n 个节点分成 A B 两组,给出矩阵\(C_{i,j}\),求\(\sum{C_{i,j}}(i \in A, j \in B)\)的最大值。
思路
n 很小,直接爆搜做。枚举一下第 i 个数在集合 A 和集合 B 的不同取值,然后向后搜索。搜索的过程中取一个最大值。
实现
#include <bits/stdc++.h>
using namespace std;
int a[22][22];
int n, res;
int vis[22];
void dfs(int now, int sum)
{
if(now == n + 1)
return;
res = max(sum, res);
int tmp = sum;
for(int i = 1; i <= n; i ++)
{
if(vis[i]) tmp -= a[now][i];
else tmp += a[now][i];
}
vis[now] = 1;
dfs(now + 1, tmp); //把now选到集合1
vis[now] = 0; //回溯
dfs(now + 1, sum); //now还是留在集合0
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
cin >> a[i][j];
memset(vis, 0, sizeof vis);
dfs(1, 0);
cout << res << '\n';
}