正题

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


题目大意

\(n\)个人,每人有\(a_i\)个属于自己的物品。\(m\)次交换依次进行,每次\(x_i,y_i\)两个人可以决定拿不拿自己的一个物品进行交换。

求\(1\)号人最后能拿到最多多少种物品

\(1\leq n,m,a_i\leq 3000\)


解题思路

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

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

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

跑最大流就好了


code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. const int N=12100,inf=1e9;
  7. struct node{
  8. int to,next,w;
  9. }a[N<<2];
  10. int T,n,m,tot,cnt,ans,s,t;
  11. int ls[N],dep[N],p[N],w[N];
  12. queue<int> q;
  13. void addl(int x,int y,int w){
  14. a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;
  15. a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
  16. return;
  17. }
  18. bool bfs(){
  19. memset(dep,0,sizeof(dep));dep[s]=1;
  20. while(!q.empty())q.pop();q.push(s);
  21. while(!q.empty()){
  22. int x=q.front();q.pop();
  23. for(int i=ls[x];i;i=a[i].next){
  24. int y=a[i].to;
  25. if(dep[y]||!a[i].w)continue;
  26. dep[y]=dep[x]+1;
  27. if(y==t)return 1;
  28. q.push(y);
  29. }
  30. }
  31. return 0;
  32. }
  33. int dinic(int x,int flow){
  34. if(x==t)return flow;
  35. int rest=0,k;
  36. for(int i=ls[x];i;i=a[i].next){
  37. int y=a[i].to;
  38. if(dep[x]+1!=dep[y]||!a[i].w)continue;
  39. rest+=(k=dinic(y,min(a[i].w,flow-rest)));
  40. a[i].w-=k;a[i^1].w+=k;
  41. if(rest==flow)return rest;
  42. }
  43. if(!rest)dep[x]=0;
  44. return rest;
  45. }
  46. int main()
  47. {
  48. freopen("collection.in","r",stdin);
  49. freopen("collection.out","w",stdout);
  50. scanf("%d",&T);
  51. while(T--){
  52. tot=0;memset(ls,0,sizeof(ls));
  53. scanf("%d%d",&n,&m);
  54. s=tot=1;t=cnt=2;ans=0;
  55. for(int i=1;i<=n;i++){
  56. p[i]=++cnt;
  57. scanf("%d",&w[i]);
  58. addl(s,p[i],1);
  59. }
  60. for(int i=1;i<=m;i++){
  61. int x,y;scanf("%d%d",&x,&y);
  62. ++cnt;addl(p[x],cnt,w[x]);p[x]=cnt;
  63. ++cnt;addl(p[y],cnt,w[y]);p[y]=cnt;
  64. addl(p[x],p[y],1);addl(p[y],p[x],1);
  65. }
  66. addl(p[1],t,inf);
  67. while(bfs())
  68. ans+=dinic(s,inf);
  69. printf("%d\n",ans);
  70. }
  71. return 0;
  72. }

YbtOJ-大收藏家【分层图,最大流】的更多相关文章

  1. ZOJ-2364 Data Transmission 分层图阻塞流 Dinic+贪心预流

    题意:给定一个分层图,即只能够在相邻层次之间流动,给定了各个顶点的层次.要求输出一个阻塞流. 分析:该题直接Dinic求最大流TLE了,网上说采用Isap也TLE,而最大流中的最高标号预流推进(HLP ...

  2. 洛谷4400 BlueMary的旅行(分层图+最大流)

    qwq 首先,我们观察到题目中提到的每天只能乘坐一次航班的限制,很容易想到建分层图,也就是通过枚举天数,然后每天加入一层新的点. (然而我一开始想的却是erf) 考虑从小到大枚举天数,然后每次新建一层 ...

  3. bzoj 1189: [HNOI2007]紧急疏散evacuate 分层图最大流_拆点_二分

    Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...

  4. ACdream 1017 [分层图][网络流]

    /* 大连热身C题 不要低头,不要放弃,不要气馁,不要慌张 题意: 给一个城市路线图,给定起点给定终点.有n个货物从起点运送到终点.城市的边是无向边. 每个货物每天如果通过某条路,那么这天这条路只能运 ...

  5. [BZOJ4205][FJ2015集训] 卡牌配对 [建图+最大流]

    题面 这是bzoj权限题,题面可以去下面的离线题库找 离线4205,只有题面,不能提交 思路 二分图匹配 这道题模型显然就是个二分图匹配嘛 那我们两两判断一下然后连边匹配.....就只有30分了 因为 ...

  6. 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)

    [题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...

  7. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  8. Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路

    2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 647  Solved: 348[Submit][Sta ...

  9. BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路

    BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路 Description “我要成为魔法少女!”     “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切, ...

随机推荐

  1. CPU 进程 线程 关系与区别

  2. Windows上使用Python2.7安装pip

    资料包含: setuptools-33.1.1 pip-18.1 ez_setup.py get-pip.py 方法一 先安装 setuptools: 进入 setuptools 文件夹,运行:pyt ...

  3. Contos 7.x 中Docker安装以及使用

    Docker是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中, 然 ...

  4. ProjectEuler 009题

    题目: A Pythagorean triplet is a set of three natural numbers, a b c, for which, a2 + b2 = c2 For exam ...

  5. mycat《对应关系》

  6. 高德地图——公交路线规划(关键字&坐标)

    &plugin=AMap.Transfer 1.关键词方式---不支持途径(仅支持2个数据) <!DOCTYPE html> <html> <head> & ...

  7. linux系统下查看svn服务是否启动,重启及设置开机重启

    Linux系统中svn服务是否启动,重启及设置开机启动   安装完svn服务器后虽然好用但是因为经常重启Linux服务器,每次重启完就要去手动启动svn服务器,很是麻烦,于是在网上找了一些方法后,自己 ...

  8. Mybatis笔记(3)

    一.多表查询 1.1 一对一查询 订单和用户(一个订单属于一个) Order实体类有user属性 配置resultMap(OrderMap) <select id="findAll&q ...

  9. C# ASP.NET RAZOR 链接SQLSERVER

    @using System.Data.SqlClient; @using System.Data;//必须引用 <html> <body> <h1>Learn Sq ...

  10. 【SpringCloud技术专题】「Eureka源码分析」从源码层面让你认识Eureka工作流程和运作机制(上)

    前言介绍 了解到了SpringCloud,大家都应该知道注册中心,而对于我们从过去到现在,SpringCloud中用的最多的注册中心就是Eureka了,所以深入Eureka的原理和源码,接下来我们要进 ...