BZOJ_3894_文理分科&&BZOJ_2127_happiness_最小割

來源:互聯網
上載者:User

標籤:highlight   dfs   script   選擇   dinic   i++   ==   bsp   ret   

BZOJ_3894_文理分科_最小割

Description 文理分科是一件很糾結的事情!(雖然看到這個題目的人肯定都沒有糾結過) 小P所在的班級要進行文理分科。他的班級可以用一個n*m的矩陣進行描述,每個格子代表一個同學的座位。每位同學必須從文科和理科中選擇一科。同學們在選擇科目的時候會獲得一個滿意值。滿意值按如下的方式得到:1.如果第i行第秒J的同學選擇了文科,則他將獲得art[i][j]的滿意值,如  果選擇理科,將得到science[i][j]的滿意值。2.如果第i行第J列的同學選擇了文科,並且他相鄰(兩個格子相鄰當且  僅當它們擁有一條相同的邊)的同學全部選擇了文科,則他會更開  心,所以會增加same_art[i][j]的滿意值。3.如果第i行第j列的同學選擇了理科,並且他相鄰的同學全部選擇了理  科,則增加same_science[i]j[]的滿意值。  小P想知道,大家應該如何選擇,才能使所有人的滿意值之和最大。請告訴他這個最大值。Input第一行為兩個正整數:n,m接下來n術m個整數,表示art[i][j];接下來n術m個整數.表示science[i][j];接下來n術m個整數,表示same_art[i][j];Output輸出為一個整數,表示最大的滿意值之和Sample Input3 4
13 2 4 13
7 13 8 12
18 17 0 5

8 13 15 4
11 3 8 11
11 18 6 5

1 2 3 4
4 2 3 2
3 1 0 4

3 2 3 2
0 2 2 1
0 2 4 4 Sample Output152轉化為“不選則割”的最小割模型。每個人要麼學文要麼學理,故S->x(a[x]),x->T(s[i])。對於所有的組合,建立兩個結點。S->p1(sa[]),p1->x(inf),x->p2(inf),p2->T(ss[])然後總權值減最小割為答案。 代碼:
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 30050#define M 500050#define S (n*m+1)#define T (n*m+2)#define p(i,j) ((i-1)*m+j)#define inf 100000000int head[N],to[M<<1],nxt[M<<1],cnt=1,n,m,dep[N],Q[N],l,r,flow[M<<1],sum,a[105][105],b[105][105];int tx[]={0,1,-1,0};int ty[]={1,0,0,-1};inline void add(int u,int v,int f) {to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; flow[cnt]=f;to[++cnt]=u; nxt[cnt]=head[v]; head[v]=cnt; flow[cnt]=0;}bool bfs() {memset(dep,0,sizeof(dep));int i; l=r=0; Q[r++]=S; dep[S]=1;while(l<r) {int x=Q[l++];for(i=head[x];i;i=nxt[i]) {if(!dep[to[i]]&&flow[i]) {dep[to[i]]=dep[x]+1;if(to[i]==T) return 1;Q[r++]=to[i];}}}return 0;}int dfs(int x,int mf) {// puts("fgvfiugv");if(x==T) return mf;int i,nf=0;for(i=head[x];i;i=nxt[i]) {if(dep[to[i]]==dep[x]+1&&flow[i]) {int tmp=dfs(to[i],min(mf-nf,flow[i]));//if(!tmp) dep[to[i]]=0;nf+=tmp;flow[i]-=tmp;flow[i^1]+=tmp;if(nf==mf) break;}}return nf;}void dinic() {int f;while(bfs()) while(f=dfs(S,inf)) sum-=f;printf("%d\n",sum);}int main() {scanf("%d%d",&n,&m);int i,j,x,k;for(i=1;i<=n;i++) {for(j=1;j<=m;j++) {scanf("%d",&x);sum+=x;add(S,p(i,j),x);}}for(i=1;i<=n;i++) {for(j=1;j<=m;j++) {scanf("%d",&x);sum+=x;add(p(i,j),T,x);}}for(i=1;i<=n;i++) {for(j=1;j<=m;j++) {scanf("%d",&a[i][j]);sum+=a[i][j];}}for(i=1;i<=n;i++) {for(j=1;j<=m;j++) {scanf("%d",&b[i][j]);sum+=b[i][j];}}int tot=n*m+2;for(i=1;i<=n;i++) {for(j=1;j<=m;j++) {tot+=2;add(S,tot-1,a[i][j]);add(tot,T,b[i][j]);add(tot-1,p(i,j),inf);add(p(i,j),tot,inf);for(k=0;k<4;k++) {int di=i+tx[k],dj=j+ty[k];if(di>=1&&di<=n&&dj>=1&&dj<=m) {add(tot-1,p(di,dj),inf);add(p(di,dj),tot,inf);}}}}dinic();}/*3 413 2 4 137 13 8 1218 17 0 58 13 15 411 3 8 1111 18 6 51 2 3 44 2 3 23 1 0 43 2 3 20 2 2 10 2 4 4 */

 

BZOJ_3894_文理分科&&BZOJ_2127_happiness_最小割

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.