hdu 1569 方格取数——最大点权独立集
2014-08-04 23:55
309 查看
此题是裸最大点权独立集,只要把总和减去最小权值覆盖即可。
关键在于建边,建二分图,把两坐标和为偶的与源连,为奇的向汇连,在把左边部分点连向有边(仅为相邻点)流量无穷大即可。
关键在于建边,建二分图,把两坐标和为偶的与源连,为奇的向汇连,在把左边部分点连向有边(仅为相邻点)流量无穷大即可。
#include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<string.h> #include<queue> #define LL int #define inf 1000000000 #define maxn 2700 using namespace std; struct pi { int to; int cost; int rev; }pp; vector<pi >g[maxn]; queue<int>q; int s,t; int line[maxn],leve[maxn]; int min(int a,int b) { int p; p=a; if(b<a) p=b; return p; } void add(int a,int b,int cos) { pp.to=b; pp.cost=cos; pp.rev=(int)g[b].size(); g[a].push_back(pp); pp.to=a; pp.cost=0; pp.rev=(int)g[a].size()-1; g[b].push_back(pp); return ; } void bfs(void) { q.push(s); int p,f,i; while(!q.empty()) { p=q.front(); q.pop(); f=(int)g[p].size(); for(i=0;i<f;i++) { pi &e=g[p][i]; if(e.cost>0&&line[e.to]<0) { line[e.to]=line[p]+1; q.push(e.to); } } } return ; } int dfs(int v,int f) { int p; if(v==t) return f; for(int &i=leve[v];i<g[v].size();i++) { pi &e=g[v][i]; if(line[v]<line[e.to]&&e.cost>0) { p=dfs(e.to,min(f,e.cost)); if(p>0) { e.cost-=p; g[e.to][e.rev].cost+=p; return p; } } } return 0; } LL dinic() { int f; LL flow=0; while(1) { memset(line,-1,sizeof(line)); memset(leve,0,sizeof(leve)); line[s]=0; bfs(); if(line[t]<0) return flow; f=dfs(s,inf); if(f==0) continue; flow+=f; while((f=dfs(s,inf))>0) { flow+=f; } } } int main() { int i,n,m,p,j; LL k; while(scanf("%d%d",&n,&m)!=EOF){ for(i=0;i<=n*m+1;i++) g[i].clear(); k=0; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ scanf("%d",&p); k+=p; if((i+j)%2==0){ add(0,(i-1)*m+j,p); } else{ add((i-1)*m+j,n*m+1,p); } } } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if((i+j)%2!=0) continue; if(i>1) add((i-1)*m+j,(i-2)*m+j,inf); if(j>1) add((i-1)*m+j,(i-1)*m+j-1,inf); if(i<n) add((i-1)*m+j,(i)*m+j,inf); if(j<m) add((i-1)*m+j,(i-1)*m+j+1,inf); } } s=0; t=n*m+1; printf("%d\n",k-dinic()); } }
相关文章推荐
- hdu 1569 方格取数(2) 网络流--最大点权独立集
- hdu 1569 方格取数(2) 最大权独立集
- HDU 1569 方格取数(2) 最大点权独立集
- 【HDU 1569】 方格取数2 --最大点权独立集
- hdu 1569 方格取数(2) 网络流 最大点权独立集
- hdu 1569 方格取数(2) 最大点权独立集
- HDU 1569 方格取数(2) 最大点权独立集
- hdu 1569 方格取数(2) 最大点权独立集
- 独立最小【网络流第五弹】最大点权独立集 ——HDU 1569 方格取数(2)
- hdu 1569 方格取数(2)【最大权独立集合-------最大流Edmond_Karp】
- HDU 1569 方格取数(2)(最大独立点集)
- hdu 1569 最大点权独立集
- hdu 1569 方格取数 最大点权独立集(hdu 1565)
- hdu 1565 方格取数 最大点权独立集
- hdu1565方格取数(1) 最大流之 最大点权独立集
- hdu 1565 方格取数(1)(最小割--最大权独立点集)
- hdu-1569(网络流)-最大点权独立集
- hdu 1569 方格取数(2)--最大点权独立集-->最大流
- HDU 1569 方格取数(2)(最大点权独立集)
- HDU 1569 最大点权独立集