sgu 128 分类: sgu 2015-03...

本文介绍一种算法,用于从一万个点中构建满足特定条件的最短闭合路径。该路径需包含所有点,且相邻点连线需与坐标轴平行,形成直角,避免交叉,最终形成闭合线。通过排序、并查集判断连通性和暴力检查交叉情况,确保路径正确。

有很多个点,最多一万个,告诉你它们的坐标。现在需要构造一条闭合线。
这个闭合线满足以下六点:
1必须是闭合的。
2必须用到所有的点。
3构造的线段之间若成角,则必须是90度。
4构造的边必须与x或y轴平行。
5构造的线段之间不存在交错和重复的情况。
6最后形成的闭合线长度必须要是所有可能中最短的。


首先根据题意处理出线段
横坐标相等的,按纵坐标从小到大排序,
第一个点与第二个点相连,第三个与第四个相连。。。
纵坐标相等的,按横坐标从小到大排序,
第一个点与第二个点相连,第三个与第四个相连。。。
O(NlogN)

最后判断连通与自交的情况,
连通用并查集O(N)
自交用暴力(^_^),O(N2),然而常数较小




#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<iostream>
#include<algorithm>

const int MAXN = 10005;

int n;
int fa[MAXN] = {0};

struct node{int x,y,i;}map[MAXN] = {0} , map0[MAXN] ={0};
struct line{int i1,i2;}mpr[MAXN] = {0}, mpc[MAXN] = {0};
int rl = 0 , cl = 0;

bool cmpr(const node &a,const node &b){return ((a.y<b.y)||(a.y == b.y && a.x<b.x));}
bool cmpc(const node &a,const node &b){return ((a.x<b.x)||(a.x == b.x && a.y<b.y));}

bool row()
{
    std::sort(map + 1, map + n +1 , cmpr);

    for(int i = 2; i <= n ; i += 2)
    {
        int j = i - 1;

        if(map[i].y == map[j].y)
        {
            ++rl;
            mpr[rl].i1 = map[j].i;
            mpr[rl].i2 = map[i].i;
        }
        else return false;
    }
    return true;
}
bool col()
{
    std::sort(map + 1, map + n +1 , cmpc);

    for(int i = 2; i <= n ; i += 2)
    {
        int j = i - 1;

        if(map[i].x == map[j].x)
        {
            ++cl;
            mpc[cl].i1 = map[j].i;
            mpc[cl].i2 = map[i].i;
        }
        else return false;
    }
    return true;
}

int find_fa(int x)
{
    if(x == fa[x])return x;
    else
     { 
      fa[x] = find_fa(fa[x]);
      return fa[x];
     }
}

bool connect()
{
    for(int i = 1 ; i <= rl; i++)
    {
        int u = find_fa(mpr[i].i1) , v = find_fa(mpr[i].i2);

        fa[std::max(u,v)] = std::min(u,v);
    }
    for(int i = 1 ; i <= cl ;i++)
    {
        int u = find_fa(mpc[i].i1) , v = find_fa(mpc[i].i2);

        fa[std::max(u,v)] = std::min(u,v);
    }

    for(int i = 1; i <= n; i++)
    {
        find_fa(i);

        if(!(fa[i] == 1))return false;
    }

    return true;
}

bool crossed()
{
    for(int i = 1 ; i <= rl; i++)
      for(int j = 1 ;j <= cl ; j++)
     {
        int a = mpr[i].i1, b = mpr[i].i2, c = mpc[j].i1, d = mpc[j].i2;
          if(map0[a].x < map0[c].x && map0[d].x < map0[b].x)
             if(map0[c].y < map0[a].y && map0[b].y < map0[d].y)
               return true;
     }


    return false;
}

int count()
{
    int ret = 0;

    for(int i = 1 ; i <= rl; i++)ret += (map0[mpr[i].i2].x - map0[mpr[i].i1].x);

    for(int i = 1 ; i <= cl; i++)ret += (map0[mpc[i].i2].y - map0[mpc[i].i1].y);

    return ret;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("sgu128.in","r",stdin);
    freopen("sgu128.out","w",stdout);
#endif

    scanf("%d",&n);

    for(int i = 1; i <= n;i++)
    {
        scanf("%d%d",&map[i].x, &map[i].y);
        map[i].i = i , fa[i] = i;
        map0[i] = map[i];
    }

    if(((n&1)==0) &&row() && col() && connect() && (!crossed()))
        printf("%d",count());
    else
        printf("0");


#ifndef ONLINE_JUDGE
    fclose(stdin);
    fclose(stdout);
#endif   
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/dashgua/p/4723082.html

标题基于Python的汽车之家网站舆情分析系统研究AI更换标题第1章引言阐述汽车之家网站舆情分析的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义说明汽车之家网站舆情分析对汽车行业及消费者的重要性。1.2国内外研究现状概述国内外在汽车舆情分析领域的研究进展与成果。1.3论文方法及创新点介绍本文采用的研究方法及相较于前人的创新之处。第2章相关理论总结和评述舆情分析、Python编程及网络爬虫相关理论。2.1舆情分析理论阐述舆情分析的基本概念、流程及关键技术。2.2Python编程基础介绍Python语言特点及其在数据分析中的应用。2.3网络爬虫技术说明网络爬虫的原理及在舆情数据收集中的应用。第3章系统设计详细描述基于Python的汽车之家网站舆情分析系统的设计方案。3.1系统架构设计给出系统的整体架构,包括数据收集、处理、分析及展示模块。3.2数据收集模块设计介绍如何利用网络爬虫技术收集汽车之家网站的舆情数据。3.3数据处理与分析模块设计阐述数据处理流程及舆情分析算法的选择与实现。第4章系统实现与测试介绍系统的实现过程及测试方法,确保系统稳定可靠。4.1系统实现环境列出系统实现所需的软件、硬件环境及开发工具。4.2系统实现过程详细描述系统各模块的实现步骤及代码实现细节。4.3系统测试方法介绍系统测试的方法、测试用例及测试结果分析。第5章研究结果与分析呈现系统运行结果,分析舆情数据,提出见解。5.1舆情数据可视化展示通过图表等形式展示舆情数据的分布、趋势等特征。5.2舆情分析结果解读对舆情分析结果进行解读,提出对汽车行业的见解。5.3对比方法分析将本系统与其他舆情分析系统进行对比,分析优劣。第6章结论与展望总结研究成果,提出未来研究方向。6.1研究结论概括本文的主要研究成果及对汽车之家网站舆情分析的贡献。6.2展望指出系统存在的不足及未来改进方向,展望舆情
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值