博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 [P3033] 牛的障碍
阅读量:4965 次
发布时间:2019-06-12

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

利用二分图匹配求最大独立集

本题的边一定平行于坐标轴,且同向的线段一定不重合,这是经典的二分图建图方法,本题要求的是最大不重合的线段数,那就是求二分图的最大独立集,最大独立集=总点数-最大匹配数。

本题有一个坑点,就是输入的数据不一定有序,也就是x1不一定比x2小

#include 
#include
#include
#include
using namespace std;int init(){ int rv=0,fh=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-') fh=-1; c=getchar(); } while(c>='0'&&c<='9'){ rv=(rv<<1)+(rv<<3)+c-'0'; c=getchar(); } return rv*fh;}int n,x,y,g[300][300],match[300];bool f[300];struct line{ int a,b,c;}col[300],row[300];bool hungarian(int u){ for(int i=1;i<=g[u][0];i++){ int v=g[u][i]; if(!f[v]){ f[v]=1; if(!match[v]||hungarian(match[v])){ match[v]=u; return 1; } } } return 0;}int main(){ n=init(); for(int i=1;i<=n;i++){ int a=init(),b=init(),c=init(),d=init(); if(a==c){ col[++x].a=a; col[x].b=min(b,d); col[x].c=max(b,d); }else{ row[++y].a=b; row[y].b=min(a,c); row[y].c=max(a,c); } } for(int i=1;i<=x;i++){ for(int j=1;j<=y;j++){ if(col[i].b<=row[j].a&&col[i].c>=row[j].a&&row[j].b<=col[i].a&&row[j].c>=col[i].a){ g[i][++g[i][0]]=j; } } } int ans=0; for(int i=1;i<=x;i++){ memset(f,0,sizeof(f)); if(hungarian(i)) ans++; } cout<
<

转载于:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8274635.html

你可能感兴趣的文章
php PDO (转载)
查看>>
wordpress自动截取文章摘要代码
查看>>
[置顶] 一名优秀的程序设计师是如何管理知识的?
查看>>
scanf和gets
查看>>
highcharts 图表实例
查看>>
ubuntu下如何查看用户登录及系统授权相关信息
查看>>
秋季学期学习总结
查看>>
SpringBoot 优化内嵌的Tomcat
查看>>
【LaTeX】E喵的LaTeX新手入门教程(1)准备篇
查看>>
highcharts曲线图
查看>>
extjs动态改变样式
查看>>
PL/SQL Developer 查询的数据有乱码或者where 字段名=字段值 查不出来数据
查看>>
宏定义
查看>>
笔记:git基本操作
查看>>
生成php所需要的APNS Service pem证书的步骤
查看>>
JavaWeb之JSON
查看>>
HOT SUMMER 每天都是不一样,积极的去感受生活 C#关闭IE相应的窗口 .
查看>>
windows平台上编译mongdb-cxx-driver
查看>>
optionMenu-普通菜单使用
查看>>
2016-2017-2点集拓扑作业[本科生上课时]讲解视频
查看>>