博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客练习赛51,D(二分图匹配)
阅读量:4049 次
发布时间:2019-05-25

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

我们把1-400个时间点看成一个集合A,把所有的羊看成集合B,第i只羊喜欢区间[a[i],b[i]],就给B中的i与A中的[a[i],b[i]]连一条边,这样就转化成了二分图匹配的模型了。我们每次询问只需在A中的[l,r]进行匹配。

本人采用匈牙利算法去做。

#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int maxn=4e2+5;bool map[maxn][maxn],vis[maxn]; //map[i][j]=1表示羊i对点j感兴趣,vis[i]=1/0表示点i是否访问过了int match[maxn],n,a[maxn],b[maxn]; //match[i]记录与点i匹配在一起的羊的编号,初始化为0bool find(int x,int l,int r){ for(int i=l;i<=r;++i) { if(map[x][i]&&!vis[i]) { vis[i]=1; if(!match[i]||find(match[i],l,r)) { match[i]=x; return 1; } } } return 0;}int main(){ int q; scanf("%d%d",&n,&q); for(int i=1;i<=n;++i) scanf("%d",&a[i]); for(int i=1;i<=n;++i) scanf("%d",&b[i]); memset(map,0,sizeof(map)); for(int i=1;i<=n;++i) { for(int j=a[i];j<=b[i];++j) map[i][j]=1; } while(q--) { int l,r; scanf("%d%d",&l,&r); int ans=0; for(int i=l;i<=r;++i) match[i]=0; for(int i=1;i<=n;++i) { for(int j=l;j<=r;++j) vis[j]=0; if(find(i,l,r)) ++ans; } printf("%d\n",ans); } return 0;}

转载地址:http://gwdci.baihongyu.com/

你可能感兴趣的文章
Oracle 异机恢复
查看>>
Oracle 12C DG 搭建(RAC-RAC/RAC-单机)
查看>>
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>
mysql 主从同步配置
查看>>
为什么很多程序员都选择跳槽?
查看>>
mongdb介绍
查看>>
mongdb在java中的应用
查看>>
区块链技术让Yotta企业云盘为行政事业服务助力
查看>>
Yotta企业云盘更好的为媒体广告业服务
查看>>
Yotta企业云盘助力旅游行业新发展
查看>>
Yotta企业云盘助力科技行业创高峰
查看>>
Yotta企业云盘更好地为教育行业服务
查看>>
Yotta企业云盘怎么帮助到能源化工行业
查看>>
企业云盘如何助力商业新发展
查看>>
医疗行业运用企业云盘可以带来什么样的提升
查看>>
教育数字智能化能为现有体系带来新的起点
查看>>
媒体广告业如何将内容资产进行高效地综合管理与利用
查看>>
能源化工要怎么管控核心数据
查看>>
媒体广告业如何运用云盘提升效率
查看>>