互联网网站开发创业计划书,石景山建设网站,html创建站点的步骤,销售的三个核心点正题
题目链接:https://jzoj.net/senior/#contest/show/3014/2 题目大意 n∗mn*mn∗m的地方#xff0c;每个地方有购买价格和收益#xff0c;一个地方如果四周都被购买那么也可以获得这个地方的收益。
求收益-价格最大。 解题思路
考虑网络流#xff0c;进行奇偶染色每个地方有购买价格和收益一个地方如果四周都被购买那么也可以获得这个地方的收益。
求收益-价格最大。 解题思路
考虑网络流进行奇偶染色对于每个格子我们拆分成xxx和x′xx′。
有建边
x−x′:valxx-x:val_xx−x′:valx若割掉这条边则不要这个点的收益对于奇点s−x:costxs-x:cost_xs−x:costx若割掉这条边则买下这个点对于偶点x′−t:costxx-t:cost_xx′−t:costx原理同上对于奇点xxx和相邻的(偶)点yyyx−y:inf,x′−y′:infx-y:inf,x-y:infx−y:inf,x′−y′:inf这两个点之间的联系且该联系不可破坏。
然后跑最小割即可。 codecodecode
#includecstdio
#includecstring
#includealgorithm
#includequeue
#define p(x,y,z) (((x-1)*my)z*n*m)
using namespace std;
const int N23*23*2,inf1e97;
const int dx[4]{1,0,-1,0};
const int dy[4]{0,1,0,-1};
struct node{int to,next,w;
}a[N*8];
int c[21][21];
int tot1,ls[N],dep[N];
int n,m,ans,s,t;
char z[21];
queueint q;
int count(char x){if(x0x9)return x-0;if(xaxz)return 10x-a;if(xAxZ)return 36x-A;
}
void addl(int x,int y,int w){a[tot].toy;a[tot].nextls[x];ls[x]tot;a[tot].ww;a[tot].tox;a[tot].nextls[y];ls[y]tot;a[tot].w0;
}
bool bfs(){memset(dep,0,sizeof(dep));while(!q.empty()) q.pop();q.push(s);dep[s]1;while(!q.empty()){int xq.front();q.pop();for(int ils[x];i;ia[i].next){int ya[i].to;if(dep[y]||!a[i].w) continue;dep[y]dep[x]1;if(yt) return 1;q.push(y);}}return 0;
}
int dinic(int x,int flow){int rest0,k;if(xt) return flow;for(int ils[x];i;ia[i].next){int ya[i].to;if(dep[x]1dep[y]a[i].w){rest(kdinic(y,min(a[i].w,flow-rest)));a[i].w-k;a[i^1].wk;if(restflow) return flow;}}if(!rest) dep[x]0;return rest;
}
void net_flow(){while(bfs())ans-dinic(s,inf);
}
int main()
{scanf(%d%d,n,m);for(int i1;in;i){scanf(%s,z1);for(int j1;jm;j)c[i][j]count(z[j]); }sp(n,m,1)1;ts1;for(int i1;in;i){scanf(%s,z1);for(int j1;jm;j){int valcount(z[j]);ansval;addl(p(i,j,0),p(i,j,1),val);if((ij)1){addl(s,p(i,j,0),c[i][j]);for(int k0;k4;k){int xidx[k],yjdy[k];if(x1||y1||xn||ym) continue;addl(p(i,j,1),p(x,y,1),inf);addl(p(i,j,0),p(x,y,0),inf);}}elseaddl(p(i,j,1),t,c[i][j]);}}net_flow();printf(%d,max(ans,0));
}