首页 > 其他分享 >文理分科(最大流最小割定理)

文理分科(最大流最小割定理)

时间:2023-08-26 16:12:01浏览次数:36  
标签:分科 cnt ll idx dep 定理 文理 sum wz

传送门

数据范围一眼网络流。

考虑每个人文理只能选一个,考虑最小割。

考虑源点\(S\)向\((i,j)\)连一条费用为\(art_{i,j}\)的边,\((i,j)\)向汇点\(T\)连一条费用为\(science_{i,j}\)的边。若割\(S\)与\((i,j)\)的边,则表示\((i,j)\)不选文,若割\((i,j_\)与\(T\)的边,则表示\((i,j)\)不选理。

然后考虑相邻的人都选文的情况,新建一个点\(cnt\),不妨设这个\(cnt\)表示\((i,j)\)及\((i,j)\)相邻的人都选了文的情况,则源点\(S\)向\(cnt\)连一条\(same_art_{i,j}\)的边,\(cnt\)分别向向\((i,j),(i+1,j),(i-1,j),(i,j+1),(i,j-1)\)连一条费用为\(inf\)的边,若割掉源点\(S\)与\(cnt\)的边,表示这五个不全选文

相邻的人选理的情况同理,只不过是向汇点连罢了。

上代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=3e5+50,hd=1e9,INF=1e15;
ll n,m,zh,s,t,sr,cnt,ans;
ll h[N],e[N],ne[N],w[N],idx=1;
void add(ll a,ll b,ll c)
{
	e[++idx]=b;
	w[idx]=c;
	ne[idx]=h[a];
	h[a]=idx;
	e[++idx]=a;
	w[idx]=0;
	ne[idx]=h[b];
	h[b]=idx; 
}
ll dep[N],now[N];
bool bfs()
{
	for(ll i=0;i<=cnt;i++) dep[i]=INF;
	dep[s]=1;
	queue<ll> q;
	q.push(s);
	now[s]=h[s];
	while(!q.empty())
	{
		ll wz=q.front();
		q.pop();
		for(ll i=h[wz];i;i=ne[i])
		{
			ll j=e[i];
			if(w[i]==0) continue;
			if(dep[j]==INF)
			{
				now[j]=h[j];
				dep[j]=dep[wz]+1;
				q.push(j);
				if(j==t) return true;
			}
		}
	}
	return false;
}
ll dfs(ll wz,ll k)
{
	if(wz==t) return k;
	ll sum,res=0;
	for(ll i=now[wz];i&&k;i=ne[i])
	{
		now[wz]=i;
		ll j=e[i];
		if(w[i]==0||dep[j]!=dep[wz]+1) continue;
		sum=dfs(j,min(k,w[i]));
		if(sum==0) dep[j]=INF;
		res+=sum;
		k-=sum;
		w[i]-=sum;
		w[i^1]+=sum;
	}
	return res;
}
int main()
{
	scanf("%lld %lld",&n,&m);
	s=0,t=1,cnt=n*m+1;
	for(ll i=1;i<=n;i++)
	{
		for(ll j=1;j<=m;j++)
		{
			scanf("%lld",&sr);
			zh+=sr;
			add(s,(i-1)*m+j+1,sr); 
		}
	}
	for(ll i=1;i<=n;i++)
	{
		for(ll j=1;j<=m;j++)
		{
			scanf("%lld",&sr);
			zh+=sr;
			add((i-1)*m+j+1,t,sr);
		}
	}
	for(ll i=1;i<=n;i++)
	{
		for(ll j=1;j<=m;j++)
		{
			scanf("%lld",&sr);
			zh+=sr;
			cnt++;
			add(s,cnt,sr);
			add(cnt,(i-1)*m+j+1,sr);
			if(i!=1) add(cnt,(i-2)*m+j+1,hd);
			if(i!=n) add(cnt,i*m+j+1,hd);
			if(j!=1) add(cnt,(i-1)*m+j,hd);
			if(j!=m) add(cnt,(i-1)*m+j+2,hd);
		}
	}
	for(ll i=1;i<=n;i++)
	{
		for(ll j=1;j<=m;j++)
		{
			scanf("%lld",&sr);
			zh+=sr;
			cnt++;
			add(cnt,t,sr);
			add((i-1)*m+j+1,cnt,sr);
			if(i!=1) add((i-2)*m+j+1,cnt,hd);
			if(i!=n) add(i*m+j+1,cnt,hd);
			if(j!=1) add((i-1)*m+j,cnt,hd);
			if(j!=m) add((i-1)*m+j+2,cnt,hd);
		}
	}
	while(bfs()) ans+=dfs(s,INF);
	printf("%lld\n",zh-ans);
	return 0;
}

标签:分科,cnt,ll,idx,dep,定理,文理,sum,wz
From: https://www.cnblogs.com/pengchujie/p/17658941.html

相关文章

  • 欧拉定理学习笔记
    欧拉定理:若\(gcd(a,m)=1\),则\(a^{\varphi(m)}\equiv1\pmod{m}\)证明:令\(r_1,r_2,···,r_{\varphi(m)}\)为模m下的一个简化剩余系,则\(ar_1,ar_2,···,ar_{\varphi(m)}\)也为模m下的一个简化剩余系,令\(f=r_1*r_2*···*r_{\varphi(m)}\),则有:\(f\equivar_1*ar_2*···*ar_{......
  • [论文理解] HACK: Learning a Parametric Head and Neck Model for High-fidelity Ani
    HACK:LearningaParametricHeadandNeckModelforHigh-fidelityAnimation上科大发布的头和脖子精细建模的参数化模型HACK。纹理转化由于HACK没有开源纹理基,我将FLAME开源的纹理基迁移到了HACK上,代码在这里开源:https://github.com/aoru45/FLAME_TO_HACK/tree/main论文......
  • Gale-Ryser 定理
    给定两个非负整数数列\(p_1\gep_2\ge\dots\gep_n\)以及\(q_1\geq_2\ge\dots\geq_m\)满足\(\sum_{i=1}^np_i=\sum_{i=1}^mq_i\),存在一个简单二分图使得左部点的度数分别为\(p_1,p_2,\dots,p_n\)、右部点的度数分别为\(q_1,q_2,\dots,q_m\)的充要......
  • BEST 定理
    BEST定理。从\(s\)出发的欧拉回路个数。选出一个内向树,对于\(u\)指定父边作为从\(u\)离开的最后一条边。再对所有节点剩余的出边随意定一个顺序,方案数是:\[T_s\timesout_s!\prod_{i\neqs}(out_i-1)!\]其中\(T_s\)是\(s\)为根的内向树个数,\(out_i\)是\(i\)的出度......
  • 主定理(但是没有证明)
    没有证明绝对不是因为我不会,证明可看:重谈主定理(master定理)及其证明这篇文章主要是写给自己看的,写的不好。\[\text{如果有}T(n)=aT(\lceil\frac{n}{b}\rceil)+O(n^d)\]\[\text{其中}n\text{问题规模,}a\text{为递推子问题数量,}\frac{n}{b}\text{为每个子问题的规模,}f(n)\text{......
  • 机器学习中的人生启示:“没有免费的午餐”定理(NFL)的个人发展之道→探讨感觉和身边其他
    #感觉和身边其他人有差距怎么办?#文章目录1引言2探究NFL定理的含义3将NFL定理应用于个人发展4探索个人兴趣和天赋5结论1引言机器学习中的“没有免费的午餐”定理(NFL)是一条深具启示意义的原则。该定理表明,没有一种算法可以在所有问题上都表现最好。在机器学习领域,这意味着没......
  • 以“文理学院”命名的,全国共有八所 宝鸡 湖北 重庆 湖南 四川 绍兴 西安
     以“文理学院”命名的,全国共有八所宝鸡湖北重庆湖南四川绍兴西安 湖南文理学院 播报编辑讨论28上传视频中国湖南省常德市境内公办高校HunanUniversityOfArtsAndScience ......
  • 中国剩余定理及其扩展
    $$\left{\begin{aligned}x_1=a_1\(mod\m_1)\x_2=a_2\(mod\m_2)\.\qquad\qquad\.\qquad\qquad\.\qquad\qquad\x_n=a_k\(mod\m_k)\end{aligned}\right.$$中国剩余定理算法流程计算所有模数的积M;对于第i个方程:a.计算$n_i\=......
  • 欧拉定理 & 扩展欧拉定理
    观前提醒:「文章仅供学习和参考,如有问题请在评论区提出」目录前置剩余类(同余类)完全剩余系(完系)简化剩余系(缩系)欧拉函数欧拉定理扩展欧拉定理参考资料前置剩余类(同余类)给定一个正整数\(n\),把所有的整数根据模\(n\)的余数\(r\in[0,n-1]\)分为\(n\)类,每一类就可以......
  • 威尔逊定理
    威尔逊定理:若p为素数,则p可以整除(p-1)!+1。用同余方程表示为:(p-1)! ≡-1(modp)证明如下充分性:当p=1时,(p-1)! ≡0(modp)当p=4时,(p-1)! ≡2(modp)当p>4时,当p为完全平方数时,设k²=p,探讨2k和p的大小,因为k²-2k在k>2的时候永远大于0,所以p>2k>k,所以(p-1)!≡ 1*2*.........