链接: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;
}
本文探讨了如何使用最大流算法解决二分图中的独立集问题,通过构建特殊的二分图模型,利用最大流计算最小点权独立集,并最终得到极大点权独立集的值。
349

被折叠的 条评论
为什么被折叠?



