P3906 Geodetic集合

这篇博客介绍了P3906 Geodetic集合问题,涉及无向连通图中特定路径上的点查找。通过使用SPFA(Shortest Path Faster Algorithm)算法,先更新x可达的所有点的最短距离,再更新b可达点的最短距离。最终遍历所有点,找到满足路径条件的点进行输出。解题过程中重点在于理解和应用SPFA算法。

P3906 Geodetic集合
又来水题了

题意

给了你一个无向连通图,每两个点至多有一天边连接。让你求给定x-y路径中的所有点。

思路

SPFA
这里回忆一下SPFA,SPFA通过松弛操作来更新两个点之间的最短距离,并且只用更新过的值来更新。
对于这个题,他要找的是x-y之间的路径,那么我们首先跟新x能到达的每个点的最短距离,然后在更新b能够到达的所有点的最短路径,这个时候我们有了a和b的最短路,那么这个时候我们就需要遍历一下所有的点,这个点满足,b能走到的位置+a能走到的位置=a走到b,满足就输出。看代码:

#include <bits/stdc++.h>

using namespace std;

const int inf = 0x3f3f3f3f, N = 1e5 + 10;

int n, m, k;
int h[N], w[N], e[N], ne[N], idx;
int dis[N], t[N];
bool st[N];

void add(int a, int b) {
   
    e[idx] = b; ne
int GetTimezoneOffset(double lon, double lat, const char* shapefile_path, std::string* out_tzid) { // 1. GDAL初始化日志 static std::once_flag gdal_init_flag; std::call_once(gdal_init_flag, [] { GDALAllRegister(); }); // 2. 数据源打开日志 GDALDataset* poDS = static_cast<GDALDataset*>( GDALOpenEx(shapefile_path, GDAL_OF_VECTOR | GDAL_OF_READONLY, nullptr, nullptr, nullptr)); if (!poDS) { FLOGW << "Open failed: " << CPLGetLastErrorMsg(); return 1; } // 3. 资源管理日志 std::unique_ptr<GDALDataset, decltype(&GDALClose)> ds_guard(poDS, GDALClose); // 4. 图层检查日志 OGRLayer* poLayer = poDS->GetLayer(0); if (!poLayer) { FLOGW << "Layer 0 not found"; return 1; } // 5. 几何对象日志 OGRPoint point(lon, lat); static OGRSpatialReference wgs84; static std::once_flag srs_flag; std::call_once(srs_flag, [] { wgs84.SetWellKnownGeogCS("WGS84"); }); point.assignSpatialReference(&wgs84); // 6. 空间过滤日志 OGREnvelope env; point.getEnvelope(&env); poLayer->SetSpatialFilterRect(env.MinX, env.MinY, env.MaxX, env.MaxY); poLayer->ResetReading(); // 7. 要素遍历日志 constexpr int MAX_FEATURES = 1000; int feature_count = 0; while (feature_count++ < MAX_FEATURES) { OGRFeature* poFeature = poLayer->GetNextFeature(); if (!poFeature) { FLOGW << "Reached end of features at count: " << feature_count; break; } std::unique_ptr<OGRFeature, decltype(&OGRFeature::DestroyFeature)> feature_guard( poFeature, OGRFeature::DestroyFeature); OGRGeometry* geom = poFeature->GetGeometryRef(); if (!geom) { FLOGW << "Feature has null geometry"; continue; } const char* tzid = poFeature->GetFieldAsString("tzid"); if (geom->Intersects(&point)) { if (tzid) { if (out_tzid) { *out_tzid = tzid; } FLOGI << "Matched timezone: " << tzid << " at (" << lon << "," << lat << ")"; const char* original_tz = getenv("TZ"); char* old_tz = nullptr; if (original_tz) { old_tz = strdup(original_tz); } setenv("TZ", tzid, 1); // 临时设置时区 tzset(); time_t now = time(nullptr); struct tm* local = localtime(&now); int offset = static_cast<int>(local->tm_gmtoff / 60); if (old_tz) { // 恢复原时区 setenv("TZ", old_tz, 1); free(old_tz); } else { unsetenv("TZ"); } tzset(); return offset; // return tzid; } } else { FLOGW << "No intersection with current feature"; } } return 1; } 以上这段代码里,其中FLOGI << "Matched timezone: " << tzid << " at (" << lon << "," << lat << ")";的lon 和lat的值是122.564,52.9745,tzid 的值是“America/Adak”,最终计算出来的时区偏移分钟数值为-540,但实际是错误的。请结合代码,帮我仔细分析这个问题,并且解决这个问题。 我的gdal的库是2023年的3.7.0版本,请根据这个版本来修复我的代码。 尽量不要修改原有功能,最终输出完整的修复代码,注意不要引用库。 另外,我输入指令ogrinfo -so -al combined-shapefile-with-oceans-now.shp 。输出的结果为 INFO: Open of `combined-shapefile-with-oceans-now.shp' using driver `ESRI Shapefile' successful. Layer name: combined-shapefile-with-oceans-now Metadata: DBF_DATE_LAST_UPDATE=2023-03-26 Geometry: Polygon Feature Count: 444 Extent: (-180.000000, -90.000000) - (180.000000, 90.000000) Layer SRS WKT: GEOGCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["latitude",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["longitude",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4326]] Data axis to CRS axis mapping: 2,1 tzid: String (80.0)
11-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值