bzoj3894 文理分科

2022-04-10 05:20:44 字數 1177 閱讀 9695

題目鏈結

先將題目轉化為求最小割。也就是要找出一些貢獻不選,使得這些貢獻的和最小。

對於單個點的貢獻。顯然我們可以從\(s\)到這個點連一條容量為選文收益的邊。從這個點到\(t\)連一條容量為選理收益的邊。

然後考慮哪些額外的貢獻。只要相鄰的這\(5\)個點中有任何乙個不選文,那麼這個集合選文的額外貢獻就沒有了。所以就新建乙個點。然後從新建的這個點向這個集合中的\(5\)個點各連一條容量為\(inf\)的邊,然後從\(s\)向這個新建的點連一條容量為貢獻的邊。對於理科同理。

然後跑一遍最小割,用總收益減去最小割即可。

#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

#define num(x,y) y + (x - 1) * m

const int n = 100000 + 10,m = 1000000 + 10,inf = 1e9;

#define change(x) x & 1 ? x + 1 : x - 1

int dx[5] = ;

int dy[5] = ;

ll read()

while(c>='0'&&c<='9')

return x*f;

}struct node e[m];

int head[n],ejs;

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

int dep[n];

int s,t;

int dfs(int u,int now)

return ret;

}queueq;

int bfs()

} return 0;

}int dinic()

int main()

} for(int i = 1;i <= n;++i)

} for(int i = 1;i <= n;++i)

add(s,num(i,j) + n * m,w);

} }for(int i = 1;i <= n;++i)

add(num(i,j) + n * m * 2,t,w);

} }cout

}

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,這個人以...