poj 2531 分权问题 dfs算法

题意:一个集合(矩阵) m[i][j]=m[j][i]权值,分成两个集合,使其权值最大。注:在同一个集合中权值只能算一个。

思路:dfs

  1. 假设都在集合0
  2. 遍历 id 的时候拿到集合1
  3. 如果与 id 相关的在集合 0 整体权值要加 否则整体权值要减
  4. 如果拿到集合 1 权值变大了,继续向后dfs,然后接着一个回溯的操作

代码上需要注意的问题:

for (int i = id + 1; i < n; i++)
    {
        if (tmp > data)
        {
            dfs(i, tmp);
            dep[i] = 0;
        }
    }

这里有个回溯的操作,如果不执行dfs的话,就说明i放到集合1并不合适,所以放到集合0

解决问题的代码:

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int map[30][30];
int dep[30];
int n, ans;
void dfs(int id, int data)
{
    dep[id] = 1;
    int tmp = data;
    for (int i = 0; i < n; i++)
    {
        if (dep[i] == 0) tmp += map[i][id];
        else tmp -= map[i][id];
    }
    if (ans < tmp) ans = tmp;
    for (int i = id + 1; i < n; i++)
    {
        if (tmp > data)
        {
            dfs(i, tmp);
            dep[i] = 0;
        }
    }
}
int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            scanf("%d", &map[i][j]);
    memset(dep, 0, sizeof(dep));
    ans = 0;
    dfs(0, 0);
    printf("%d
", ans);
    return 0;
}
君子知命不惧,自当日日自新
原文地址:https://www.cnblogs.com/xuxiaojin/p/9405672.html