YbtOJ-大收藏家【分层图,最大流】

1|0正题

题目链接:https://www.ybtoj.com.cn/contest/117/problem/2


1|1题目大意

n个人,每人有ai个属于自己的物品。m次交换依次进行,每次xi,yi两个人可以决定拿不拿自己的一个物品进行交换。

1号人最后能拿到最多多少种物品

1n,m,ai3000


1|2解题思路

每种物品只需要一个,所以每种物品的第一个可以视为流量,ai可以视为自己的物品处的空位(自己的物品可以不视为自己的)。

xi,yi的交换可以视为一条流量为1的双向边,因为依次进行所以要分成m层,然后每一层有交换的连边。

发现这样有很多点没有用到,去掉这些多余的,那点数就是O(n+m)级别的了

跑最大流就好了


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int N=12100,inf=1e9; struct node{ int to,next,w; }a[N<<2]; int T,n,m,tot,cnt,ans,s,t; int ls[N],dep[N],p[N],w[N]; queue<int> q; void addl(int x,int y,int w){ a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w; a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0; return; } bool bfs(){ memset(dep,0,sizeof(dep));dep[s]=1; while(!q.empty())q.pop();q.push(s); while(!q.empty()){ int x=q.front();q.pop(); for(int i=ls[x];i;i=a[i].next){ int y=a[i].to; if(dep[y]||!a[i].w)continue; dep[y]=dep[x]+1; if(y==t)return 1; q.push(y); } } return 0; } int dinic(int x,int flow){ if(x==t)return flow; int rest=0,k; for(int i=ls[x];i;i=a[i].next){ int y=a[i].to; if(dep[x]+1!=dep[y]||!a[i].w)continue; rest+=(k=dinic(y,min(a[i].w,flow-rest))); a[i].w-=k;a[i^1].w+=k; if(rest==flow)return rest; } if(!rest)dep[x]=0; return rest; } int main() { freopen("collection.in","r",stdin); freopen("collection.out","w",stdout); scanf("%d",&T); while(T--){ tot=0;memset(ls,0,sizeof(ls)); scanf("%d%d",&n,&m); s=tot=1;t=cnt=2;ans=0; for(int i=1;i<=n;i++){ p[i]=++cnt; scanf("%d",&w[i]); addl(s,p[i],1); } for(int i=1;i<=m;i++){ int x,y;scanf("%d%d",&x,&y); ++cnt;addl(p[x],cnt,w[x]);p[x]=cnt; ++cnt;addl(p[y],cnt,w[y]);p[y]=cnt; addl(p[x],p[y],1);addl(p[y],p[x],1); } addl(p[1],t,inf); while(bfs()) ans+=dinic(s,inf); printf("%d\n",ans); } return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14412567.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(45)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示