hdu 4885 TIANKENG’s travel(bfs)

hdu 4885 TIANKENG’s travel(bfs)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

题目链接:hdu 4885 TIANKENG’s travel

题目大意:给定N,L,表示有N个加油站,每次加满油能够移动距离L,必须走直线,可是能够为斜线。然后给出sx,sy,ex,ey,以及N个加油站的位置,问说最少经过几个加油站,路过不加油也算。

解题思路:一開始以为经过能够不算,所以o(n2)的复杂度建图,然后用bfs求最短距离,结果被FST了。
将点依照x坐标排序,这样在建图是保证当前点为最左点,每次建立一条边的时候,将该边的斜率记录,下次有同样的斜率则不加边,斜率能够用两个整数表示,可是要注意化简成最简。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 1005;

struct point {
    int id;
    ll x, y;
}p[maxn], s, e;

ll L;
int N, d[maxn];
vector<int> g[maxn];
set<pii> vis;

inline ll gcd (ll a, ll b) {
    return b == 0 ? a : gcd(b, a%b);
}

inline bool cmp (const point& a, const point& b) {
    return a.x < b.x;
}

inline ll dis (ll x, ll y) {
    return x * x + y * y;
}

bool search (ll x, ll y) {
    ll d = gcd(x, y);
    if (d < 0)
        d = -d;

    x /= d; y /= d;
    if (vis.find(make_pair(x, y)) != vis.end())
        return true;

    vis.insert(make_pair(x, y));
    return false;
}

void addEdge (point a, point b) {
    ll d = dis(a.x - b.x, a.y - b.y);
    if (d <= L && !search(b.x - a.x, b.y - a.y)) {
        g[a.id].push_back(b.id);
        g[b.id].push_back(a.id);
        //printf("%d %d %lld %lld\n", a.id, b.id, d, L * L);
    }
}

void init () {
    scanf("%d%lld", &N, &L);
    scanf("%lld%lld%lld%lld", &p[0].x, &p[0].y, &p[1].x, &p[1].y);
    p[0].id = 0;
    p[1].id = 1;

    N += 2;
    L = L * L;

    for (int i = 0; i < N; i++)
        g[i].clear();

    for (int i = 2; i < N; i++) {
        scanf("%lld%lld", &p[i].x, &p[i].y);
        p[i].id = i;
    }

    sort(p, p + N, cmp);

    for (int i = 0; i < N; i++) {
        vis.clear();
        for (int j = i + 1; j < N; j++)
            addEdge(p[i], p[j]);
    }
}

void bfs () {
    queue<int> que;
    que.push(0);
    memset(d, -1, sizeof(d));
    d[0] = 0;

    while (!que.empty()) {
        int u = que.front();
        que.pop();

        if (u == 1) {
            printf("%d\n", d[u]-1);
            return;
        }

        for (int i = 0; i < g[u].size(); i++) {
            int v = g[u][i];

            if (d[v] == -1) {
                d[v] = d[u] + 1;
                que.push(v);
            }
        }
    }
    printf("impossible\n");
}

int main () {
    int cas;
    scanf("%d", &cas);
    while (cas--) {
        init();
        bfs();
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118420.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • tomcat 虚拟目录配置appBase和docBase的区别

    先看server.xml文件host配置appBase:这个目录下面的子目录将自动被部署为应用,且war文件将被自动解压缩并部署为应用,默认为tomcat下webapps目录,如果不想访问默认ROOT目录,修改这里

    2022年4月9日
    86
  • cunit教程linux,linux下CUnit使用

    cunit教程linux,linux下CUnit使用4.C++Test1)简介C++Test是一个功能强大的自动化C/C++单元级测试工具,可以自动测试任何C/C++函数、类,自动生成测试用例、测试驱动函数或桩函数,在自动化的环境下极其容易快速的将单元级的测试覆盖率达到100%。2)功能特性即时测试类/函数支持极端编程模式下的代码测试自动建立类/函数的测试驱动程序和桩调用自动建立和执行类/函数的测试用例提供快速加入和执行说明和功能性测试的框架执行自…

    2022年6月17日
    20
  • 网站优化怎样的外链能轻松收录,网站外链优化攻略「建议收藏」

    网站优化怎样的外链能轻松收录,网站外链优化攻略「建议收藏」有些事情,让你感到很无奈,网站外链优化也是如此,往往那些很容易发布网站外链的地方,价值不大,而不容易发布外链的地方,一旦发布上去了,效果胜过几十条甚至更多的外链,而且可以轻松让搜索引擎收录,网站优化怎样让网站外链轻松被收录呢?<ignore_js_op>一、善于寻找我们运营的是网站,发布外链的地方也是网站,除了内容有差异之外,权重高低也有差别,我们要找的自然是高于我们权重的网站,…

    2022年7月21日
    12
  • mycat实现读写分离_mycat主从复制

    mycat实现读写分离_mycat主从复制1,课程回顾2,本章重点mysql主从原理,好处mycat概念,读写分离好处,读写分离的实现3,具体内容3.1mysql主从3.1.1linux下mysql安装以mysql5.6为例1)修改IP地址,修改主机名称vim/etc/sysconfig/network-scripts/ifcfg-ens33vim/etc/hostname2)安装mysql查看已经安装mysql组件:(centos6.9需要卸载原来的mysql

    2022年10月13日
    1
  • visio 密钥_激活visio2013的产品密钥

    visio 密钥_激活visio2013的产品密钥visio密钥:软件已经安装成功。希望对大家有用。Q37MJ-MMDGH-PWGWW-73YBQ-H3398

    2022年8月13日
    6
  • 让我教你怎么做个人_如何制作app平台

    让我教你怎么做个人_如何制作app平台我们都知道,开发一个app很大程度依赖服务端:服务端提供接口数据,然后我们展示;另外,开发一个app,还需要美工协助切图。没了接口,没了美工,app似乎只能做成单机版或工具类app,真的是这样的吗?先来展示下我的个人app,没有服务端,没有美工完成的,换言之,我干了所有人的活:这个app叫“微言”,他对于我意义很重大,最初微言只是我一个练手的项目,刚刚工作,技术有限,微言只是sqlite

    2022年10月21日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号