2015-2016 Northwestern European Regional Contest (NWERC 2015) 补题

C.Cleaning Pipes

题意:给出n条管道(线段),任意两个管道之间之多有一个交点,忽略一个管道头部和其他管道的交点,问能否选出一个不相交的管道集合来使得所有交点都被这些管道覆盖。

思路:将管道抽象成点,两个管道的交点抽象成边,那么问题转化成判断新建的图是否是一个二分图。

判断二分图最常用的方法就是染色法,本题当然也就可以用,然而我看dalao的代码还学了另一种方法:利用并查集判断,感觉这种方法的本质就是利用二分图不含奇环的性质(我自己yy的)。

具体做法就是将点集扩大两倍,i,j之间有边就merge(i, j + n),merge(i + n, j).最后判断一下i和i + n是否属于同一个集合。如果有一个属于同一个集合,则说明该图不是二分图。

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 2020;
struct P{
    int x, y;
    P(int _x = 0, int _y = 0) : x(_x), y(_y) {}
    bool operator == (P &b)
    {
        return x == b.x && y == b.y;
    }
}well[MAXN], L[MAXN], R[MAXN];
//计算向量p1p2与向量p1p3的叉积,若p1p3在p1p2的逆时针方向,则返回>0,顺时针方向返回<0
int mul(P p1, P p2, P p3)
{
    return (p2.x - p1.x) * (p3.y - p1.y) - (p3.x - p1.x) * (p2.y - p1.y);
}
bool intersect(P p1,P p2,P q1,P q2)
{
//快速排斥
    if(max(p1.x,p2.x)<min(q1.x,q2.x)||
       max(q1.x,q2.x)<min(p1.x,p2.x)||
       max(p1.y,p2.y)<min(q1.y,q2.y)||
       max(q1.y,q2.y)<min(p1.y,p2.y))
    retur
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值