【代码超详解】POJ 1556 The Doors(建图 + 最短路)

本文详细解析POJ 1556问题,通过建图方法连接符合条件的点,并利用Dijkstra算法求解最短路径。建图策略包括考虑点所在墙的编号差异和能否直接到达,最后给出AC代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、传送门

http://poj.org/problem?id=1556

二、算法分析说明与代码编写指导

建图的方法是:
如果两个点所在墙的编号相差 1 (起点和终点的编号记为 0 和 4n +1),那么把这两点连起来(无向边);
如果两个点在同一个墙上,这两点不连边;
如果两个点中间隔了其它的墙,需要先判断是否能直接到达而不是被中间的墙挡住。判断的方法是:把这两点连一条直线(得到斜截式 y = kx + b),考察中间的墙的开口部分是否经过直线。若是,则这堵墙不会挡住这两点的直连边;否则,会挡住,这两点不可以连边。
建完图以后直接跑一次最短路就可以了。
Dijkstra 算法
wid 返回一个点所在墙的编号。1、2、3、4 所在的墙编号为 1;5、6、7、8 对应编号 2,以此类推。

三、AC 代码

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<bitset>
#include<vector>
#pragma warning(disable:4996)
using namespace std;
struct wall {
    double x, y[4]; }; struct edge {
    int v; double w; }; struct point {
    int id; double x, y; };
const double dm = 1e9; const int nm = 74, wm = 20;
int m, n, t, x, y; wall w[wm]; vector<edge> g[nm]; point p[nm]; edge e; bitset<nm> v; double d[nm + 1];
inline double dist(const point& p, const point& q) {
    return sqrt(pow(p.x - q.x, 2) + pow(p.y 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值