hdu1565 方格取数 最大流(二分图极大点权独立集) 或状态压缩dp

本文探讨了如何使用最大流算法解决二分图中的独立集问题,通过构建特殊的二分图模型,利用最大流计算最小点权独立集,并最终得到极大点权独立集的值。

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1565

思路:构建二分图分成x和y,极大点权独立集 = sum - 最小点权独立集 

  最小点权独立集 = 最小割 = 最大流

增加源点s和汇点t,s到每个x集合的点连边,权为点权,y到t连边,边权为点权。x到y中点相邻的加一条边权为INF,设所有点权和为sum,求s-t最大流,sum减去最大流即可。

由于点数少,直接最暴力的增广即可。

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	> File Name: flow.cpp
	> Author: kdh
	> Mail: oralce__o@163.com
	> Created Time: Tue 09 Sep 2014 04:58:08 PM CST
 ************************************************************************/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<algorithm>
#include<vector>
const int INF = 0x3f3f3f3f;
using namespace std;
struct
{
    int v,id,c;
}a[25][25];
int cnt = 0,n;
int cap[700][700];
int flow[700][700];
int g[700],p[700];
void addedge(int u,int v,int c)
{
    if(v == 0) return;
    cap[u][v] = c;
}
void getg()
{
    memset(cap,0,sizeof(cap));
    for(int i = 1; i <= n; ++i)
       for(int j = 1;j <= n; ++j){
            if(a[i][j].c == 1)addedge(cnt + 1,a[i][j].id,a[i][j].v);
            else addedge(a[i][j].id,cnt + 2,a[i][j].v);
            if(a[i][j].c == 0) continue;
           addedge(a[i][j].id,a[i - 1][j].id,INF);
           addedge(a[i][j].id,a[i + 1][j].id,INF);
           addedge(a[i][j].id,a[i][j + 1].id,INF);
           addedge(a[i][j].id,a[i][j - 1].id,INF);
      }
}
int maxflow()
{
    int s = cnt + 1,t = cnt + 2;
    queue<int> q;
    int f = 0;
    memset(flow,0,sizeof(flow));
    while(true){
        memset(g,0,sizeof(g));
        g[s] = INF;
        q.push(s);
        while(!q.empty()){
            int u = q.front();q.pop();
            for(int v = 1;v <= cnt + 2;++v)if(!g[v] && cap[u][v] > flow[u][v]){
                p[v] = u;q.push(v);
                g[v] = min(g[u],cap[u][v] - flow[u][v]);
            }
        }
        if(g[t] == 0) break;
        for(int u = t;u != s ;u = p[u]){
            flow[p[u]][u] += g[t];
            flow[u][p[u]] -= g[t];
        }
        f += g[t];
    }
    return f;
}
int main(){

    int sum;
    while(~scanf("%d",&n)){
       sum = cnt = 0;memset(a,0,sizeof(a));
        for(int i = 1; i <= n; ++i){
            int f = i & 1;
              for(int j = 1;j <= n; ++j){
                    scanf("%d",&a[i][j].v);
                    a[i][j].id = ++cnt;
                    a[i][j].c = f;f = f ^ 1;
                    sum += a[i][j].v;
              }
        }
        getg();
        printf("%d\n", sum - maxflow());

    }
   return 0;
}


源码链接: https://pan.quark.cn/s/fa13cd6c6c8d Chrome浏览器作为一款备受青睐的网页浏览器,凭借其出色的稳定性和运行速度获得了广泛认可。 然而出于安全考量,Chrome系统默认不兼容ActiveX插件,因为ActiveX技术主要应用于Internet Explorer,它赋予网页内容与用户本地系统交互的能力,但同时也可能引发潜在的安全隐患。 不过在某些特定工作场景下,比如在企业内部网络环境需要与老旧应用程序整合时,可能仍需在Chrome中启用ActiveX控件。 为此我们必须掌握在Chrome浏览器下加载和运用ActiveX的方法。 首先需要明确ActiveX的本质。 ActiveX是由微软设计的一种技术框架,旨在开发可在网页环境中运行的控件,这些控件能够完成多种功能,包括视频播放、应用程序组件运行与硬件设备通信等。 ActiveX控件多以OCX(OLE控件)格式发布。 在Chrome浏览器中启用ActiveX需要采额外措施,因为该浏览器本身并不支持此项技术。 以下是几种常见的解决方案: 1. **应用Chrome的兼容性设置**:部分Chrome版本提供了" --enable-internal-activex"命令行参,可通过此参使浏览器具备加载ActiveX控件的能力。 用户可在启动Chrome时,于快捷方式的目标路径后附加该参来激活此功能。 例如:"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --enable-internal-activex。 2. **安装第三方插件**:市面上存在一些第三方插件,例如"IE Tab""ActiveX Con...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值