BZOJ 3894 文理分科

2022-03-18 06:24:27 字數 1362 閱讀 4702

題鏈:

(要許可權號啊。。。用這個交吧)

題解:

題目大意:

n*m的矩陣,每個位置有乙個人

每個人有兩個選擇:a和 b,並給出每個人對應的選擇後的收益。(a[i][j],b[i][j])       

同時如果乙個人和它上下左右相鄰的人選擇相同,會多收益乙個對應的值。(sa[i][j],sb[i][j])

問選擇的最大收益值為多少。

題還不錯,乙個最小割模型。

建圖:建立超源 s(a選擇)和超匯 t(b選擇)。

每個人拆成 3個點: (i,j), (i,j)', (i,j)''

s -> (i,j)  :(a[i][j])

(i,j) -> t  :(b[i][j])

s -> (i,j)' :(sa[i][j])

(i,j) -> t  :(sb[i][j])

(i,j)' -> (四個方向) :(inf)

(四個方向) -> (i,j)'':(inf)

然後求最小割der,用所有值的總和-der即為答案。

**:

#include#include#include#include#define maxn 45000

#define maxm 300000

#define inf 0x3f3f3f3f

#define tag 1003

using namespace std;

const int mv[5][2]=,,,,};

struct edge

void adde(int u,int v,int w)

int next(int i,bool type)

}e;int cur[maxn],d[maxn];

int n,m,s,t,ans;

int idx(int i,int j,int k)

bool bfs()

} return d[t];

}int dfs(int u,int reflow)

if(!flowout) d[u]=0;

return flowout;

}int dinic()

return flow;

}int main()

} for(int i=1,_i,_j,x;i<=n;i++)

for(int j=1;j<=m;j++)

} int der=dinic();

ans-=der;

printf("%d",ans);

return 0;

}

BZOJ 3894 文理分科

time limit 10 sec memory limit 512 mb submit 194 solved 122 submit status discuss description 文理分科是一件很糾結的事情!雖然看到這個題目的人肯定都沒有糾 結過 小p所在的班級要進行文理分科。他的班級可以用...

BZOJ 3894 文理分科

解四個方程。為了簡潔我們畫出來兩個來解方程推理一下。s a aa s b ab a t ba b t bb s x a和其他相關格仔收益 x t 同上 include include include include include define maxn 1000010 using namespac...

bzoj3894 文理分科

s向每個人連邊,容量是選文科的滿意值 每個點向t連邊,容量是選理科的滿意值。再新建2 n m個點,表示每個人和相鄰的人都選文 p1 或都選理 p2 s向p1連邊,容量為這個人的same art,p1再向這個人和相鄰的四個人都連inf的邊 p2向t連邊,容量為這個人的same science,這個人以...