SP18966 VACATION - Vacation Planning 题解
题意简述
给定一张有向带权图,有 个请求,每个请求给出点 ,,费用为 经过点 中的至少一个到达 的最小权值和。求出可行的请求数和最小费用和。
分析
有多个询问,很明显是多源最短路,求多源最短路可以用 Floyd,也可以调用 次 Dijkstra。
核心代码
int dis[205][205]; bool vis[205][205]; void Dijkstra(int s) { memset(dis[s] + 1, 0x3f3f3f3f, sizeof dis[s] + 1); memset(vis[s] + 1, 0, sizeof vis[s] + 1); struct poi { int d, p; bool operator<(const poi& x)const { return d > x.d; } }; priority_queue <poi>q; dis[s][s] = 0; q.push({ 0, s }); while (!q.empty()) { int u = q.top().p; q.pop(); if (vis[s][u])continue; vis[s][u] = true; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i].v; if (dis[s][v] > dis[s][u] + g[u][i].w) { dis[s][v] = dis[s][u] + g[u][i].w; q.push({ dis[s][v],v }); } } } } //主程序调用 for (int i = 1; i <= n; i++)Dijkstra(i); //这样,dis[i][j]就是i到j的最短路径了
询问部分,依然是类似 Floyd 插 个点进行松弛操作,其他题解写得很清楚,这里不再赘述。
本文作者:tmjyh09
本文链接:https://www.cnblogs.com/tmjyh09/p/15740174.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步