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;
    }
    君子知命不惧,自当日日自新
  • 相关阅读:
    卷积神经网络
    TensorFlow线性回归
    TensorFlow常用操作
    TensorFlow基本计算单元——变量
    Pandas基础
    Numpy基础
    Python基础
    Windows下安装TensorFlow教程
    mongodb并列查询,模糊查询
    C#对Mongodb数组对象操作
  • 原文地址:https://www.cnblogs.com/xuxiaojin/p/9405672.html
Copyright © 2011-2022 走看看