zoukankan      html  css  js  c++  java
  • 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;
    }
    君子知命不惧,自当日日自新
  • 相关阅读:
    腾讯云 Serverless 产品动态 20200827
    双指针 86. 分隔链表(链表 dummyhead)
    双指针:15. 三数之和
    双指针:283. 移动零
    双指针:167. 两数之和 II
    关于数组
    关于抽象类,接口以及多态
    关于字符串
    关于异常
    动手动脑3
  • 原文地址:https://www.cnblogs.com/xuxiaojin/p/9405672.html
Copyright © 2011-2022 走看看