poj 2531 分权问题 dfs算法

Posted xuxiaojin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于poj 2531 分权问题 dfs算法的主要内容,如果未能解决你的问题,请参考以下文章

POJ2531:Network Saboteur

poj 3050 地图5位数问题 dfs算法

dfs与dp算法之关系与经典入门例题

贪心算法----区间覆盖问题(POJ2376)

搜索算法:深度优先搜索(DFS)

POJ题目总结