「USACO11NOV」牛的障碍Cow Steeplechase 解题报告
题面
横的,竖的线短段,求最多能取几条没有相交的线段?
思路
学过网络流的童鞋在哪里?
是时候重整网络流雄风了!
好吧,废话不多说
这是一道最小割的题目
怎么想呢?
要取最多,那反过来不就是不能取的要尽量少吗?
深思熟虑一番后,符合网络流中的最小割,于是开码
哦,还没完!
建边是关键!
由于只有方向不同的线段才会互相影响,所以考虑在方向不同时建边
由于最小割的用途是使图不连通,所以我们把横的线段与源点相连,竖的线段与汇点相连(相反也可以),在有相交的线段之间建一条边,表示能连通,这样就变成了求最小割
但是!
要注意的是:由于题目的要求是取线段,而不是我们建的边,因此我们把一个点(线段)拆成入点和出点,在入点和出点之间建一条容量为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 解题报告的更多相关文章
- Luogu P3033 [USACO11NOV]牛的障碍Cow Steeplechase(二分图匹配)
P3033 [USACO11NOV]牛的障碍Cow Steeplechase 题意 题目描述 --+------- -----+----- ---+--- | | | | --+-----+--+- ...
- 牛的障碍Cow Steeplechase
题目描述 Farmer John has a brilliant idea for the next great spectator sport: Cow Steeplechase! As every ...
- 「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 ...
- 「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告
P2906 [USACO08OPEN]牛的街区Cow Neighborhoods 题目描述 Those Who Know About Cows are aware of the way cows gr ...
- 「SHOI2016」黑暗前的幻想乡 解题报告
「SHOI2016」黑暗前的幻想乡 sb题想不出来,应该去思考原因,而不是自暴自弃 一开始总是想着对子树做dp,但是状态压不起去,考虑用容斥消减一些条件变得好统计,结果越想越乱. 期间想过矩阵树定理, ...
- 「ZJOI2015」地震后的幻想乡 解题报告
「ZJOI2015」地震后的幻想乡 想了半天,打开洛谷题解一看,最高票是_rqy的,一堆密密麻麻的积分差点把我吓跑. 据说有三种解法,然而我只学会了一种最辣鸡的凡人解法. 题意:给一个无向图\(G\) ...
- 「SCOI2014」方伯伯的玉米田 解题报告
#2211. 「SCOI2014」方伯伯的玉米田 发现是取一个最长不下降子序列 我们一定可以把一个区间加的右端点放在取出的子序列的最右边,然后就可以dp了 \(dp_{i,j}\)代表前\(i\)个玉 ...
- [USACO11NOV]牛的障碍Cow Steeplechase
洛谷传送门 题目描述: 给出N平行于坐标轴的线段,要你选出尽量多的线段使得这些线段两两没有交点(顶点也算),横的与横的,竖的与竖的线段之间保证没有交点,输出最多能选出多少条线段. 因为横的与横的,竖的 ...
- [USACO11NOV]牛的障碍Cow Steeplechase(匈牙利算法)
洛谷传送门 题目描述: 给出N平行于坐标轴的线段,要你选出尽量多的线段使得这些线段两两没有交点(顶点也算),横的与横的,竖的与竖的线段之间保证没有交点,输出最多能选出多少条线段. 因为横的与横的,竖的 ...
随机推荐
- 认识web前端开发
web前端开发 1.web即web系统,是以网站的形式呈现,通过浏览器的访问来实现一定的功能的系统. 2.什么是前端开发? 前端开发是创建web页面或app等前端界面呈现给用户的过程.通过html.c ...
- vue1——vue引入方法,npm本地安装
博客地址 :https://www.cnblogs.com/sandraryan/ Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架.Vue 只关注视图层, 采用 ...
- LRJ-Example-06-01-Uva210
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstdlib> #include <cstrin ...
- 神经网络为什么需要多次epoch
Δw(t)=−ε ∂w(t)∂E +αΔw(t−1)(9) 我们知道反向传播每次迭代的效果是这样的:w=w+Δw(t) w=w+\Delta w(t)w=w+Δw(t) 我们知道,每条训练数据都会导 ...
- LightOJ 1123 Trail Maintenance
题意:n个城市m天.每一天修一条道路,输出当前天数的最小生成树,但是这里有一个条件,就是说最小生成树必须包括全部n个城市,否则输出-1 思路:边数有6000如果每一天跑一次最小生成树的话就接近O(m^ ...
- CSS3 ,fill-available、max-content、min-content、fit-content,自适应
自适应: 撑满空闲空间与收缩到内容尺寸. CSS3将这两种情况分别定义为'fill-availabel'和'fit-content'. 除此之外 ,还新增了更细粒度的'min-content'和'ma ...
- Python--day20--序列化模块
序列化:转向一个字符串数据类型 序列 ———— 字符串 序列化和反序列化的概念: 序列化三种方法:json pickle shelve json模块:json模块提供了四个方法dumps和load ...
- 软件自动化测试 selenium IDE + Firebug + python脚本
按顺序步骤来 一.安装软件 1.1.1 webDriver(就是selenium IDE) 解析:本来这两个东西就合成一个了,但是更新到后来,安装的时候又独立安装的. 安装 Python ...
- 简单的Spring Batch示例
使用Spring Batch做为批处理框架,可以完成常规的数据量不是特别大的离线计算. 现在写一个简单的入门版示例. 这里默认大家已经掌握了Spring Batch的基本知识,示例只是为了快速上手实践 ...
- python3在pycharm中为什么导入random模块不能用? TypeError: 'module' object is not callable
新手学python求大神指导,也用sys导入了random.py的路径,仍然不行. 刚刚排错貌似找到了问题的原因...那是因为我在pycharm中新建的python文件名就是random,所以当前目录 ...