当前位置: 首页 > news >正文

洛谷 4382 [八省联考2018]劈配——二分图匹配

题目:https://www.luogu.org/problemnew/show/P4382

原本想着网络流。不过看了一番题解发现二分图匹配也行。

原本想着第一问也二分,不过看了一番题解发现一档一档地判断就行。不过不知道复杂度是怎样的。

原本想着第二问二分,把后面人的影响去掉的方法是在网络流里断掉源点连向后面人的边。不过看了一番题解发现用二分图匹配,把 n 个图都存下来,二分的时候在对应的图上做就行了。

数据范围小的话真是可以存很多东西来降低复杂度。自己应该拓宽思路。

二分图匹配的时候用 vector 记录每个导师已经匹配了哪些人;再记录该导师战队还剩下多少人(不用专门记也可,用原来的 b[ ] 减去 vector 的 size 即可),就能增广了。

重新认识了匈牙利算法。每次给对面的点打 vis 标记也是为了不让增广路径上的点匹配回原来的选择。

注意换导师的匹配的时候要把这个人从 vector 里删掉。用了那种 erase + remove 的方法。这个操作其实是线性的吧?感觉复杂度全靠信仰。不过竟然还跑得很快。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define pb push_back
#define it per[cs[cr]]
using namespace std;
int rdn()
{
  int ret=0;bool fx=1;char ch=getchar();
  while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}
  while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();
  return fx?ret:-ret;
}
const int N=205,M=15;
int n,m,s[N]; bool vis[N];
int a[N][N][M],len[N][N];
struct Gra{
  int b[N],c[N],cs[N];
  vector<int> per[N];
  bool xyl(int cr,int nw)
  {
    for(int i=1,v;i<=len[cr][nw];i++)
      if(!vis[v=a[cr][nw][i]])
      {
    vis[v]=1;
    if(b[v])
      {
        if(cs[cr])
          {
        b[cs[cr]]++;//
        it.erase(remove(it.begin(),it.end(),cr));//
          }
        b[v]--;per[v].pb(cr);
        cs[cr]=v; c[cr]=nw; return true;
      }
    for(int j=0,lm=per[v].size();j<lm;j++)
      if(xyl(per[v][j],c[per[v][j]]))
        {
          if(cs[cr])
        {
          b[cs[cr]]++;
          it.erase(remove(it.begin(),it.end(),cr));//
        }
          b[v]--;per[v].pb(cr);
          cs[cr]=v; c[cr]=nw; return true;
        }
      }
    return false;
  }
  void solve(int cr)
  {
    for(int i=1,lm;i<=m;i++)
      if(len[cr][i])
    {
      memset(vis,0,sizeof vis);
      if(xyl(cr,i))break;
    }
    if(!c[cr])c[cr]=m+1;
  }
}g[N],f;
bool chk(int cr,int mid)
{
  f=g[cr-mid-1];
  for(int i=1;i<=s[cr];i++)
    {
      memset(vis,0,sizeof vis);//
      if(f.xyl(cr,i))return true;
    }
  return false;
}
int main()
{
  int T=rdn(),C=rdn();
  while(T--)
    {
      memset(len,0,sizeof len);
      n=rdn();m=rdn();
      for(int i=1;i<=m;i++)g[0].b[i]=rdn();
      for(int i=1,d;i<=n;i++)
    for(int j=1;j<=m;j++)
      {
        d=rdn();if(d)a[i][d][++len[i][d]]=j;
      }
      for(int i=1;i<=n;i++)s[i]=rdn();
      for(int i=1;i<=n;i++)
    { g[i]=g[i-1]; g[i].solve(i);}
      for(int i=1;i<=n;i++)
    printf("%d ",g[i].c[i]);puts("");
      for(int i=1;i<=n;i++)
    {
      if(g[i].c[i]<=s[i])
        {printf("0 ");continue;}
      int l=1,r=i-1,ret=i;
      while(l<=r)
        {
          int mid=l+r>>1;
          if(chk(i,mid))ret=mid,r=mid-1;
          else l=mid+1;
        }
      printf("%d ",ret);
    }
      puts("");
    }
  return 0;
}

 

转载于:https://www.cnblogs.com/Narh/p/10572201.html

相关文章:

  • ubuntu18.04系统下用devstack安装openstack(最新版)
  • Solr笔记二之Solr与Tomcat整合
  • 代码块
  • 【Unity Shaders】《Unity Shaders and Effects Cookbook》总结篇
  • 如何将PPT转成Word格式?好用的格式转换工具!
  • [翻译] RSKImageCropper
  • 独热编码和dummy编码的作用
  • iOS绘图例2:增加Undo/Redo功能
  • grep简单用法及脚本基础篇
  • SysUtils.UpperCase、SysUtils.LowerCase - 大小写转换
  • 使用X-UA-Compatible来设置IE浏览器兼容模式
  • 区块链技术对未来的影响
  • Delphi 2009 新增的 Class Explorer
  • jar包和war包的区别:
  • 新手须知 C、C++和VC++之间的区别
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • ES2017异步函数现已正式可用
  • SOFAMosn配置模型
  • vue:响应原理
  • Vue全家桶实现一个Web App
  • 官方解决所有 npm 全局安装权限问题
  • 检测对象或数组
  • 简单基于spring的redis配置(单机和集群模式)
  • 如何使用 JavaScript 解析 URL
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 数组的操作
  • 王永庆:技术创新改变教育未来
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用简单代码看卷积组块发展
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • NLPIR智能语义技术让大数据挖掘更简单
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​渐进式Web应用PWA的未来
  • #100天计划# 2013年9月29日
  • #WEB前端(HTML属性)
  • (5)STL算法之复制
  • (Forward) Music Player: From UI Proposal to Code
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (十五)使用Nexus创建Maven私服
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net Core与存储过程(一)
  • .NET 表达式计算:Expression Evaluator
  • .net开发引用程序集提示没有强名称的解决办法
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [CSS]中子元素在父元素中居中
  • [Google Guava] 1.1-使用和避免null
  • [JavaWeb学习] tomcat简介、安装及项目部署
  • [lesson17]对象的构造(上)
  • [MYSQL]mysql将两个表结果合并到一起
  • [POJ 1915] Knight Moves
  • [Redis]基础入门
  • [Todo] C++学习资料进度