https://www.luogu.org/fe/problem/P3033

二分图最大独立集

注意输入的时候控制x1,y1,x2,y2的相对大小.

#include<bits/stdc++.h>
using namespace std;
#define ll long long /* dinic begin */ const int MAXN=5000;
const int MAXM=120000;
//注意网络流要预留反向边
const int INF=0x3f3f3f3f;
struct Edge{
int to,next,cap,flow;
}edge[MAXM]; int tol;
int head[MAXN]; void init(){
tol=2;
memset(head,-1,sizeof(head));
} void addedge(int u,int v,int w=1,int rw=0){
edge[tol].to=v;edge[tol].cap=w;edge[tol].flow=0;
edge[tol].next=head[u];head[u]=tol++;
edge[tol].to=u;edge[tol].cap=rw;edge[tol].flow=0;
edge[tol].next=head[v];head[v]=tol++;
} int Q[MAXN];
int dep[MAXN],cur[MAXN],sta[MAXN];
bool bfs(int s,int t,int n){
int front=0,tail=0;
memset(dep,-1,sizeof(dep[0])*(n+1));
dep[s]=0;
Q[tail++]=s;
while(front<tail){
int u=Q[front++];
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].to;
if(edge[i].cap>edge[i].flow&&dep[v]==-1){
dep[v]=dep[u]+1;
if(v==t)
return true;
Q[tail++]=v;
}
}
}
return false;
} int dinic(int s,int t,int n=-1){
int maxflow=0;
if(n==-1)
n=t;
n++;//假如把t作为编号最后的点的话传入t就可以了
while(bfs(s,t,n)){
for(int i=0;i<n;i++)cur[i]=head[i];
int u=s,tail=0;
while(cur[s]!=-1){
if(u==t){
int tp=INF;
for(int i=tail-1;i>=0;i--){
tp=min(tp,edge[sta[i]].cap-edge[sta[i]].flow); }
maxflow+=tp;
for(int i=tail-1;i>=0;i--){
edge[sta[i]].flow+=tp;
edge[sta[i]^1].flow-=tp;
if(edge[sta[i]].cap-edge[sta[i]].flow==0)
tail=i;
}
u=edge[sta[tail]^1].to; }
else if(cur[u]!=-1&&edge[cur[u]].cap>edge[cur[u]].flow
&&dep[u]+1==dep[edge[cur[u]].to]){
sta[tail++]=cur[u];
u=edge[cur[u]].to;
}
else{
while(u!=s&&cur[u]==-1){
u=edge[sta[--tail]^1].to;
}
cur[u]=edge[cur[u]].next;
}
}
}
return maxflow;
} /* 备注:
1.检查MAXN与MAXM,注意预留反向边和额外边的位置
2.每次建图的第一次addedge()前必须先init()
3.不传入第三参数的dinic(s,t)需保证t是最后的结点
*/ /* dinic end */ struct Line{
int x1,y1,x2,y2;
Line(){}
inline void input(){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1>x2)
swap(x1,x2);
if(y1>y2)
swap(y1,y2);
}
inline bool intersection(Line &l){
if(x1==x2){
if(l.x1==l.x2)
return false;
else{
if(l.x1<=x1&&x1<=l.x2&&y1<=l.y1&&l.y1<=y2)
return true;
else
return false;
}
}
else{
if(l.y1==l.y2)
return false;
else{
if(l.y1<=y1&&y1<=l.y2&&x1<=l.x1&&l.x1<=x2)
return true;
else
return false;
}
}
}
inline bool samex(){
return x1==x2;
}
}line[5000]; int main(){
init(); int n;
scanf("%d",&n);
int s=0,t=n+1;
for(int i=1;i<=n;i++){
line[i].input();
if(line[i].samex()){
addedge(s,i);
}
else{
addedge(i,t);
}
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(line[i].intersection(line[j])){
if(line[i].samex())
addedge(i,j);
else
addedge(j,i);
}
}
} int ans=n-dinic(s,t);
printf("%d\n",ans);
}

洛谷 - P3033 - 牛的障碍Cow Steeplechase - 二分图最大独立集的更多相关文章

  1. Luogu P3033 [USACO11NOV]牛的障碍Cow Steeplechase(二分图匹配)

    P3033 [USACO11NOV]牛的障碍Cow Steeplechase 题意 题目描述 --+------- -----+----- ---+--- | | | | --+-----+--+- ...

  2. 洛谷 [P3033] 牛的障碍

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

  3. [USACO11NOV]牛的障碍Cow Steeplechase

    洛谷传送门 题目描述: 给出N平行于坐标轴的线段,要你选出尽量多的线段使得这些线段两两没有交点(顶点也算),横的与横的,竖的与竖的线段之间保证没有交点,输出最多能选出多少条线段. 因为横的与横的,竖的 ...

  4. 牛的障碍Cow Steeplechase

    题目描述 Farmer John has a brilliant idea for the next great spectator sport: Cow Steeplechase! As every ...

  5. 洛谷P1522 牛的旅行 Cow Tours

    ---恢复内容开始--- P1522 牛的旅行 Cow Tours189通过502提交题目提供者该用户不存在标签 图论 USACO难度 提高+/省选-提交该题 讨论 题解 记录 最新讨论 输出格式题目 ...

  6. [USACO11NOV]牛的障碍Cow Steeplechase(匈牙利算法)

    洛谷传送门 题目描述: 给出N平行于坐标轴的线段,要你选出尽量多的线段使得这些线段两两没有交点(顶点也算),横的与横的,竖的与竖的线段之间保证没有交点,输出最多能选出多少条线段. 因为横的与横的,竖的 ...

  7. 洛谷 P1522 牛的旅行 Cow Tours 题解

    P1522 牛的旅行 Cow Tours 题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不 ...

  8. 洛谷P2971 牛的政治Cow Politics

    题目描述 Farmer John's cows are living on \(N (2 \leq N \leq 200,000)\)different pastures conveniently n ...

  9. 洛谷 P1522 牛的旅行 Cow Tours

    题目链接:https://www.luogu.org/problem/P1522 思路:编号,然后跑floyd,这是很清楚的.然后记录每个点在这个联通块中的最远距离. 然后分连通块,枚举两个点(不属于 ...

随机推荐

  1. HDU 5145 NPY and girls (莫队分块离线)

    题目地址:HDU 5145 莫队真的好奇妙.. 这种复杂度竟然仅仅有n*sqrt(n)... 裸的莫队分块,先离线.然后按左端点分块,按块数作为第一关键字排序.然后按r值作为第二关键字进行排序. 都是 ...

  2. Mac OS command line TestNG - “Cannot find class in classpath” error

    直接eclipse执行.xml文件可以正确执行 在mac下执行却总报错: [TestNG] [Error] Cannot find class in classpath 最后解决办法,classpat ...

  3. JavaScript常用库

    提供个学习几种库的url,记录下. 1.JavaScript简介 JavaScript是Netscape公司开发的一种脚本语言(scripting language).JavaScript的出现使得网 ...

  4. pyquery模块

    pyquery 这个模块基本是仿JQuery的形式,也支持CSS选择器语法,因此对于爬虫来说,避免了正则表达式的滥用. 创建对象 from pyquery import PyQuery as pq d ...

  5. Django框架学习——python模拟Django框架(转载)

    原贴来源 http://wiki.woodpecker.org.cn/moin/ObpLovelyPython/AbtWebModules python实现web服务器 web开发首先要有web服务器 ...

  6. Java Web工作原理(转载)

    知识要点: 1.HTTP协议 2.web服务器的缺陷及其解决方案 3.对Servlet的认识 4.Servlet的主要任务 5.web容器对Servlet的支持包括的内容 HTTP协议---(Hype ...

  7. webstrom编辑react语法报错解决

    问题: 解决办法:1.把 JavaScript 的版本设置为 JSX Harmony. 2.把<script>type类型改为:text/jsx

  8. cpio

    1 压缩 -o,生成cpio格式的归档文件.从标准输入获取文件名列表. 2 解压 -i,对cpio格式的归档文件进行解压,生成单个的文件. 3 --null 从标准输入获取的文件名列表为"\ ...

  9. PPTP&L2TP&PPPOE client and server configure

    一. PPPOE 1. server(参考http://laibulai.iteye.com/blog/1171898) (1)安装rp-pppoe:yum install rp-pppoe (2)配 ...

  10. Template Pattern

    1.Template模式解决的问题:对于某一个业务逻辑在不同的对象中有不同的细节实现,但是逻辑的框架是相同的.将逻辑框架放在抽象基类中,并定义好细节的接口,子类中实现细节.Template模式利用多态 ...