博客
关于我
POJ 1228 Grandpa's Estate (稳定凸包)
阅读量:793 次
发布时间:2023-03-03

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

如何判断凸包是否稳定

凸包稳定性的判断问题是一个重要的几何问题。给定一组点,这些点位于凸包上(即没有凸包内部的点,要么是凸包顶点,要么是凸包边上的点),我们需要判断这些点是否能构成一个稳定的凸包。所谓稳定,是指是否可以在原有凸包上增加点,从而构成一个更大的凸包,并且这个新的凸包包含原有凸包上的所有点。

不稳定的凸包示例

考虑一个简单的例子:四个点组成一个凸包的部分点。通过绘制这四个点的位置可以发现,这些点并不是稳定的。因为在其中一条边上只存在两个端点,而没有其他点。当在这条边外引入一个新的点时,可以构成一个更大的凸包,从而使原来的凸包不再稳定。具体来说,当一条边上只有两个点时,这条边是“脆弱的”,容易被破坏。

稳定凸包的示例

相反地,一个稳定凸包的特征是每条边上都至少有三个点。在这种情况下,无法在边外引入新的点来扩展凸包,因为任何新增点都会导致新的凸包成为凹多边形。

判断方法总结

通过以上分析,我们可以得出以下结论:为了判断一个凸包是否稳定,我们需要:

  • 计算给定点的凸包
  • 检查凸包上的每一条边是否至少包含三个点
  • 如果存在一条边不满足上述条件,则凸包是不稳定的,输出“NO”;否则输出“YES”
  • 代码实现

    #include 
    #include
    #include
    #include
    #include
    using namespace std;
    struct point {
    double x, y;
    };
    double dis(point a, point b) {
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
    }
    int cmp(const void *a, const void *b) {
    point c = *(point *)a;
    point d = *(point *)b;
    double k = multi(p[0], c, d);
    if (k < 0 || (k == 0 && dis(c, p[0]) > dis(d, p[0])))
    return 1;
    return -1;
    }
    void Convex() {
    for (int i = 1; i < N; i++) {
    point temp;
    if (p[i].y < p[0].y || (p[i].y == p[0].y && p[i].x < p[0].x)) {
    temp = p[i];
    p[i] = p[0];
    p[0] = temp;
    }
    }
    qsort(p + 1, N - 1, sizeof(p[0]), cmp);
    stack[0] = p[0];
    stack[1] = p[1];
    top = 1;
    for (int i = 2; i < N; i++) {
    while (top >= 1 && multi(stack[top - 1], stack[top], p[i]) < 0)
    top--;
    top++;
    stack[top] = p[i];
    }
    }
    bool judge() {
    for (int i = 1; i < top; i++) {
    if (multi(stack[i - 1], stack[i + 1], stack[i]) != 0 &&
    multi(stack[i], stack[i + 2], stack[i + 1]) != 0) {
    return false;
    }
    }
    return true;
    }
    int main() {
    int t;
    cin >> t;
    while (t--) {
    cin >> N;
    for (int i = 0; i < N; i++)
    cin >> p[i].x >> p[i].y;
    Convex();
    if (!judge())
    cout << "NO";
    else
    cout << "YES";
    }
    }

    总结

    通过上述方法,我们可以高效地判断给定点集是否构成一个稳定的凸包。代码部分实现了上述逻辑,能够在短时间内完成判断任务。

    转载地址:http://yuxfk.baihongyu.com/

    你可能感兴趣的文章
    POJ 1061 青蛙的约会 (扩展欧几里得)
    查看>>
    Quartz2.2.1简单使用
    查看>>
    POJ 1080 Human Gene Functions(DP:LCS)
    查看>>
    Quant 开源项目教程
    查看>>
    POJ 1088 滑雪
    查看>>
    POJ 1095 Trees Made to Order
    查看>>
    POJ 1113 Wall(计算几何--凸包的周长)
    查看>>
    poj 1125Stockbroker Grapevine(最短路)
    查看>>
    Qualitor processVariavel.php 未授权命令注入漏洞复现(CVE-2023-47253)
    查看>>
    poj 1151 (未完成) 扫描线 线段树 离散化
    查看>>
    POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并
    查看>>
    poj 1163 数塔
    查看>>
    POJ 1177 Picture(线段树:扫描线求轮廓周长)
    查看>>
    Qualitor checkAcesso.php 任意文件上传漏洞复现(CVE-2024-44849)
    查看>>
    POJ 1182 食物链(并查集拆点)
    查看>>
    POJ 1185 炮兵阵地 (状态压缩DP)
    查看>>
    POJ 1195 Mobile phones
    查看>>
    POJ 1228 Grandpa's Estate (稳定凸包)
    查看>>
    poj 1236(强连通分量分解模板题)
    查看>>
    poj 1258 Agri-Net
    查看>>