题目链接:https://www.ybtoj.com.cn/contest/117/problem/2
n个人,每人有ai个属于自己的物品。m次交换依次进行,每次xi,yi两个人可以决定拿不拿自己的一个物品进行交换。
求1号人最后能拿到最多多少种物品
1≤n,m,ai≤3000
每种物品只需要一个,所以每种物品的第一个可以视为流量,ai可以视为自己的物品处的空位(自己的物品可以不视为自己的)。
xi,yi的交换可以视为一条流量为1的双向边,因为依次进行所以要分成m层,然后每一层有交换的连边。
发现这样有很多点没有用到,去掉这些多余的,那点数就是O(n+m)级别的了
跑最大流就好了
#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__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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语句:使用策略模式优化代码结构