Loading

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';
}
posted @ 2022-12-28 12:41  DM11  阅读(35)  评论(0编辑  收藏  举报