P1646 [国家集训队]happiness(最小割模型)
发布日期:2021-06-30 10:20:50 浏览次数:2 分类:技术文章

本文共 1773 字,大约阅读时间需要 5 分钟。

首 先 是 个 最 小 割 模 型 首先是个最小割模型

s 向 节 点 连 一 条 选 文 科 的 价 值 ( s 表 示 文 科 ) s向节点连一条选文科的价值(s表示文科) s(s)

节 点 向 t 连 一 条 选 理 科 的 价 值 ( t 表 示 理 科 ) 节点向t连一条选理科的价值(t表示理科) t(t)

这 样 能 满 足 选 理 科 就 割 掉 文 科 , 选 文 科 就 割 掉 理 科 这样能满足选理科就割掉文科,选文科就割掉理科 ,

但 是 还 有 组 合 情 况 呢 ! ! 设 文 科 组 合 价 值 l , 理 科 组 合 价 值 r 但是还有组合情况呢!!设文科组合价值l,理科组合价值r l,r

A 和 B 同 时 选 理 科 就 要 割 掉 l A和B同时选理科就要割掉l ABl

A 和 B 同 时 选 文 科 就 要 割 掉 r A和B同时选文科就要割掉r ABr

A 和 B 一 个 文 一 个 理 , 就 要 割 掉 l 和 r A和B一个文一个理,就要割掉l和r AB,lr

转化为模型来说,需要满足

当 割 掉 A 和 B 连 向 t 的 边 表 示 都 选 理 科 , 那 么 还 需 要 割 掉 r 才 行 当割掉A和B连向t的边表示都选理科,那么还需要割掉r才行 ABt,r

换 而 言 之 , 因 为 边 r 的 存 在 , A 和 B 仍 然 能 到 t , 没 有 形 成 割 换而言之,因为边r的存在,A和B仍然能到t,没有形成割 ,r,ABt,

所 以 新 建 一 个 虚 点 q , A 和 B 向 q 连 i n f 边 , q 向 t 连 r 边 所以新建一个虚点q,A和B向q连inf边,q向t连r边 q,ABqinf,qtr

这样就没有形成割了!!

w w w的建立同理

而且当你建立 q q q w w w时,你发现三个条件都满足了

所以模型长这个样子

在这里插入图片描述

#include 
#include
#include
#include
#define FOR(i,a,b) for(int i=a;i<=b;++i)const int N=1e5+5,M=5e6+5;const int inf=1<<30;int n,m,tot=1,lnk[N],ter[M],nxt[M],val[M],dep[N],cnr[N];int id(int x,int y) { return (x-1)*m+y;}void add(int u,int v,int w) { ter[++tot]=v,nxt[tot]=lnk[u],lnk[u]=tot,val[tot]=w;}void addedge(int u,int v,int w) { add(u,v,w),add(v,u,0);}int bfs(int s,int t) { memset(dep,0,sizeof(dep)); memcpy(cnr,lnk,sizeof(lnk)); std::queue
q; q.push(s),dep[s]=1; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=lnk[u];i;i=nxt[i]) { int v=ter[i]; if(val[i]&&!dep[v]) q.push(v),dep[v]=dep[u]+1; } } return dep[t];}int dfs(int u,int t,int flow) { if(u==t) return flow; int ans=0; for(int i=cnr[u];i&&ans

转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/108265758 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:最小割的可行边和必须边(以及最小割的构造)
下一篇:P2224 [HNOI2001]产品加工(进程dp)

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月30日 18时10分55秒