题面

横的,竖的线短段,求最多能取几条没有相交的线段?

思路

学过网络流的童鞋在哪里?

是时候重整网络流雄风了!

好吧,废话不多说

这是一道最小割的题目

怎么想呢?

要取最多,那反过来不就是不能取的要尽量少吗?

深思熟虑一番后,符合网络流中的最小割,于是开码

哦,还没完!

建边是关键!

由于只有方向不同的线段才会互相影响,所以考虑在方向不同时建边

由于最小割的用途是使图不连通,所以我们把横的线段源点相连,竖的线段汇点相连(相反也可以),在有相交的线段之间建一条边,表示能连通,这样就变成了求最小割

但是!

要注意的是:由于题目的要求是取线段,而不是我们建的边,因此我们把一个点(线段)拆成入点出点,在入点和出点之间建一条容量为1的边,其余边的容量都赋为INF,这样就肯定不会“割”去,只会“割”去点

还有!

怎么判断线段香蕉相交呢?

画出来就知道了

这个小问题,就留给大家思考吧

Code:

#include<bits/stdc++.h>//虽然我不想写注释
#define INF 0x7f7f7f7f//但是不写注释的不是好孩纸?!h^ovny:谁说的!
#define M 65010
#define N 510
using namespace std;
struct Node{
int lx,ly,rx,ry,i;
Node(int a,int b,int c,int d,int e):lx(a),ly(b),rx(c),ry(d),i(e){ }
Node(){ }
}A[N>>1],B[N>>1];//这个是分开存横的和竖的线段
struct node{
int to,cap;
int nxt;
node(int a,int b):to(a),cap(b){ }
node(){ }
}b[M<<1];//边
int head[N],deep[N];
int n,Maxflow,S,T,t=1,ta,tb;
int read()
{
int s=0;
char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c))
{
s=(s<<1)+(s<<3)+c-'0';
c=getchar();
}
return s;
}
void add(int x,int y,int cap)//建边,比较冗长,别介意
{
b[++t]=node(y,cap);
b[t].nxt=head[x];
head[x]=t;
b[++t]=node(x,0);
b[t].nxt=head[y];
head[y]=t;
return;
}
bool BFS()
{
int i,cur;
int to,cap;
queue<int>p;
memset(deep,0,sizeof(deep));
deep[S]=1;p.push(S);
while(!p.empty())
{
cur=p.front();p.pop();
for(i=head[cur];i;i=b[i].nxt)
{
to=b[i].to;cap=b[i].cap;
if(cap&&!deep[to])
{
deep[to]=deep[cur]+1;
p.push(to);
if(to==T)
return 1;
}
}
}
return 0;
}
int Dinic(int k,int flow)
{
if(k==T)
return flow;
int i,to,cap,res,rest=flow;
for(i=head[k];i&&rest;i=b[i].nxt)
{
to=b[i].to;cap=b[i].cap;
if(cap&&deep[to]==deep[k]+1)
{
res=Dinic(to,min(rest,cap));
if(!res)
deep[to]=0;
b[i].cap-=res;
b[i^1].cap+=res;
rest-=res;
}
}
return flow-rest;
}
int main()
{
int i,j,flow;
int lx,ly,rx,ry;
n=read();T=n+n+1;//源点一般赋为0,那就先确定汇点
for(i=1;i<=n;i++)//读入,然后开始玄学建边
{
lx=read();ly=read();
rx=read();ry=read();
if(lx==rx)
{
B[++tb]=Node(min(lx,rx),min(ly,ry),max(lx,rx),max(ly,ry),i);//注意,要是两端点有序!
add(S,i,INF);
for(j=1;j<=ta;j++)//判断是否满足,然后建边
if(B[tb].ry>=A[j].ly&&B[tb].ly<=A[j].ly&&A[j].lx<=B[tb].lx&&B[tb].lx<=A[j].rx)
add(i+n,A[j].i,INF);
}
else
{
A[++ta]=Node(min(lx,rx),min(ly,ry),max(lx,rx),max(ly,ry),i);
add(i+n,T,INF);//一切同上
for(j=1;j<=tb;j++)
if(B[j].ry>=A[ta].ly&&B[j].ly<=A[ta].ly&&A[ta].lx<=B[j].lx&&B[j].lx<=A[ta].rx)
add(B[j].i+n,i,INF);
}
add(i,i+n,1);//自己的入点和出点之间建边
}
while(BFS())//Dinic模板直接搬
while((flow=Dinic(S,INF)))
Maxflow+=flow;
printf("%d",n-Maxflow);
return 0;
}

「USACO11NOV」牛的障碍Cow Steeplechase 解题报告的更多相关文章

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

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

  2. 牛的障碍Cow Steeplechase

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

  3. 「USACO13MAR」「LuoguP3080」 牛跑The Cow Run (区间dp

    题目描述 Farmer John has forgotten to repair a hole in the fence on his farm, and his N cows (1 <= N ...

  4. 「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告

    P2906 [USACO08OPEN]牛的街区Cow Neighborhoods 题目描述 Those Who Know About Cows are aware of the way cows gr ...

  5. 「SHOI2016」黑暗前的幻想乡 解题报告

    「SHOI2016」黑暗前的幻想乡 sb题想不出来,应该去思考原因,而不是自暴自弃 一开始总是想着对子树做dp,但是状态压不起去,考虑用容斥消减一些条件变得好统计,结果越想越乱. 期间想过矩阵树定理, ...

  6. 「ZJOI2015」地震后的幻想乡 解题报告

    「ZJOI2015」地震后的幻想乡 想了半天,打开洛谷题解一看,最高票是_rqy的,一堆密密麻麻的积分差点把我吓跑. 据说有三种解法,然而我只学会了一种最辣鸡的凡人解法. 题意:给一个无向图\(G\) ...

  7. 「SCOI2014」方伯伯的玉米田 解题报告

    #2211. 「SCOI2014」方伯伯的玉米田 发现是取一个最长不下降子序列 我们一定可以把一个区间加的右端点放在取出的子序列的最右边,然后就可以dp了 \(dp_{i,j}\)代表前\(i\)个玉 ...

  8. [USACO11NOV]牛的障碍Cow Steeplechase

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

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

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

随机推荐

  1. 网站的域名带www的和不带www的有什么区别呀

    国内用户习惯用www,不过默认的不带www的域名要好过带www的,带Www的是二级域名,不带的是顶级域名,默认的在搜索引擎中得权重会比较高 区别就在于一个带www一个不带www 其他都一样.www的域 ...

  2. 命名分组(?<name>....)

    捕获组分为: 普通捕获组(Expression) 命名捕获组(?Expression) 普通捕获组 从正则表达式左侧开始,每出现一个左括号"("记做一个分组,分组编号从 1 开始. ...

  3. sql语句列名为变量(Spring Boot+mybitis实验环境)

    之前用的#{参数},在列名.表明部分一直不能成为变量.折腾了很久,结果仅仅是改为${变量}就可以了.

  4. html5 canvas 3d屏保 源码

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...

  5. ABSD 基于架构的软件设计方法方法简介(摘抄)

    ABSD(Architecture-Based Software Design)基于架构的软件设计方法 有三个基础: 第一个基础是功能分解.在功能分解中,ABSD方法使用已有的基于模块的内聚和耦合技术 ...

  6. Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.1.3.RELEASE:repackage (repackage)

    解决方案是删除 pom.xml配置的问题 <build> <plugins> <plugin> <groupId>org.springframework ...

  7. jQuery签名插件jSignature

    1.引入jSignature.min.js和jquery.min.js文件2.代码 <div id="signature"></div> 3.js 初始化 ...

  8. Codeforces Round #200 (Div. 1 + Div. 2)

    A. Magnets 模拟. B. Simple Molecules 设12.13.23边的条数,列出三个等式,解即可. C. Rational Resistance 题目每次扩展的电阻之一是1Ω的, ...

  9. H3C 静态路由配置

  10. 1119 机器人走方格 V2 (组合数学)

    M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果.   Input 第1行,2个数M,N,中间用空格隔开 ...