`
scott________
  • 浏览: 21587 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
最近访客 更多访客>>
社区版块
存档分类
最新评论

poj 2420 A Star not a Tree? 多边形 费马点

阅读更多

题目描述: http://poj.org/problem?id=2420

题目大意: 其实是求n 边形的费马点, 即到n 边形的n 个顶点距离和最小的点,
                   该题要求计算出最小距离, 并四舍五入.

算法大意: 先拿一个点(该算法用n 个顶点的x, y 坐标和的均值所在的点)去计算距离和
                   最小值, 然后拿它的四个方向上的点去测试比较哪个点更优, 不断
                   迭代, 最终得到在精度允许下的费马点.

#include <cstdio>
#include <cmath>

struct point {
    double x, y;
    point() {
        x = y = 0.0;
    }
};
//返回两点间的距离
inline double mydistance(point p1, point p2) {
    return sqrt((p1.x - p2.x) * (p1.x - p2.x)
                + (p1.y - p2.y) * (p1.y - p2.y));
}

//求n 边形的费马点(参数p_fermat), 返回最小距离和
double fermat_point(point p[], int n, point& p_fermat) {
    point u, v;
    double step = 0.0, curlen, explen, minlen;
    int i, j, k, idx;
    bool flag;
    //u.x = u.y = v.x = v.y = 0.0;  //point "构造函数"
    for(i = 0; i < n; i++) {
        step += fabs(p[i].x) + fabs(p[i].y);
        u.x += p[i].x;
        u.y += p[i].y;
    }
    u.x /= n;
    u.y /= n;
    flag = 0;
    while(step > 1e-10) {
        for(k = 0; k < 10; step /= 2, k++)
            for(i = -1; i <= 1; i++)
                for(j = -1; j <= 1; j++) {
                    v.x = u.x + step * i;
                    v.y = u.y + step * j;
                    curlen = explen = 0.0;
                    for(idx = 0; idx < n; idx++) {
                        curlen += mydistance(u, p[idx]);
                        explen += mydistance(v, p[idx]);
                    }
                    if(curlen > explen) {
                        u = v;
                        minlen = explen;
                        flag = 1;
                    }
                }
    }
    p_fermat = u;
    return flag ? minlen : curlen;
}

int main() {
    point ploygon[101], p_fermat;
    double len;
    int n;
    while(scanf("%d", &n) != EOF) {
        for(int i = 0; i < n; i++)
            scanf("%lf %lf", &ploygon[i].x, &ploygon[i].y);
        len = fermat_point(ploygon, n, p_fermat);

        // rounded to the nearest integer
        /* if(len - (int)len > 0.5)
            printf("%d\n", (int)(len + 1));
        else
            printf("%d\n", int(len)); */
		printf("%d\n", int(len + 0.5));
    }
    return 0;
}




以上算法参考自代码疯子的博客:http://www.programlife.net/poj-2420-polygon-fermat-point.html

分享到:
评论

相关推荐

    POJ2525-Text Formalization【TrieTree】

    《POJ2525-Text Formalization:深入解析TrieTree》 在计算机科学的世界里,算法和数据结构是解决问题的关键。今天我们要探讨的是一个名为"POJ2525-Text Formalization"的问题,它涉及到一种高效的数据结构——Trie...

    POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】

    【标题】"POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】"涉及的是一道编程竞赛题目,主要考察参赛者的数据结构与算法应用能力,特别是Trie树(字典树)、并查集(MergeSet)以及欧拉路径(Euler Path)这...

    poj 1909 Marbles on a tree.md

    poj 1909 Marbles on a tree.md

    poj 1308 Is It A Tree_.md

    poj 1308 Is It A Tree_.md

    POJ1584-A Round Peg in a Ground Hole

    【标题】"POJ1584-A Round Peg in a Ground Hole" 是一道来自北京大学在线判题系统POJ(Problem Set)的经典算法题目。这道题目主要涉及的是几何计算和位运算的应用,属于计算机科学中的基础算法问题。 【描述】...

    POJ2255-Tree Recovery

    【标题】"POJ2255-Tree Recovery" 是一个来自北京大学在线判题系统POJ(Problem Set of Peking University)的编程题目。这个题目主要涉及到数据结构和图论的知识,尤其是树的恢复问题。 【描述】"北大POJ2255-Tree...

    POJ1942-Paths on a Grid

    【标题】"POJ1942-Paths on a Grid"是北京大学在线编程平台POJ上的一道经典算法题目,其主要目标是探索在网格上行走的路径问题。 【描述】该题目的描述中提到“解题报告+AC代码”,这暗示了解决此问题的关键在于...

    POJ1005-I Think I Need a Houseboat

    【标题】"POJ1005-I Think I Need a Houseboat" 是一个编程竞赛题目,源自北京大学的在线评测系统POJ(Problem Set of Peking University)。这个题目旨在考验参赛者的算法设计和实现能力,主要涉及数据结构和动态...

    POJ2488-A Knight's Journey【骑士游历】

    【标题】"POJ2488-A Knight's Journey【骑士游历】" 【知识点解析】 本题是来自北京大学在线编程平台POJ的一道经典算法题——“骑士游历”。题目要求解决的是一个典型的图论问题,即在国际象棋棋盘上,骑士能否...

    POJ1691-Painting A Board 【拓扑+DFS】

    【标题】"POJ1691-Painting A Board 【拓扑+DFS】"是一个源自北京大学在线编程平台POJ的编程题目,它主要涉及到图论中的拓扑排序和深度优先搜索(DFS)算法。该题目的核心是解决一个与涂色相关的实际问题,通过运用...

    poj 2201 Cartesian Tree.md

    poj 2201 Cartesian Tree.md

    poj数算实习tree解答

    Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist(u,v)=The min distance between node u and v. Give an integer k,for every pair (u,v) of vertices is ...

    POJ2031-Building a Space Station【Prim+计算几何】

    【标题】"POJ2031-Building a Space Station【Prim+计算几何】"是一道编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。该题目结合了图论中的Prim算法与计算几何领域的知识,挑战参赛者的算法...

    poj各种分类

    标题和描述中的“poj各种分类”主要指向的是在POJ(Peking University Online Judge)平台上,根据解题策略和算法类型对题目进行的分类。POJ作为一个知名的在线编程平台,提供了大量的算法练习题,适合从初学者到...

    POJ动态规划题目全面总结

    PKU Online Judge上面很全面的动态规划试题总结。动态规划是ACM考点中最重要的一大类算法之一,对于工作人员来说,动态规划也是实际开发中...这是POJ上面很多DP题目的总结与深刻分析。利于算法学习,学长给的,在此分享

    POJ1004-Financial Management

    【标题】"POJ1004 - Financial Management" 是一个来自北京大学在线判题系统POJ(Problem Set of Peking University)的编程题目。这个题目主要涉及到计算机科学中的算法设计和实现,特别是与财务管理和计算相关的...

    北京大学poj题目类型分类

    * 1308 Is It A Tree?:这是一个构造题目,要求学习者编写一个程序来判断是否是一个树。 * 1316 Self Numbers:这是一个构造题目,要求学习者编写一个程序来计算自我数字。 特殊问题 特殊问题是POJ题目中的一种...

    POJ算法题目分类

    * 图的深度优先遍历和广度优先遍历:图的深度优先遍历和广度优先遍历是指遍历图的两种方式,如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最短路径算法:最短路径算法是指计算图中两点之间的最短...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    POJ3414-Pots

    标题“POJ3414-Pots”是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。这个题目主要考察的是算法设计和实现能力,通常涉及计算机科学中的数据结构和算法知识。 解题报告是参赛者在...

Global site tag (gtag.js) - Google Analytics