博客
关于我
POJ 3411 DFS
阅读量:803 次
发布时间:2023-03-03

本文共 1791 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要找到从城市1到城市n的最小费用路径。费用计算方式是:如果在路径中已经访问过某个特定城市,则费用为P,否则费用为R。我们可以使用广度优先搜索(BFS)结合状态压缩来解决这个问题。

方法思路

  • 问题分析:我们需要从城市1到城市n,费用取决于是否在路径中已经访问过某个特定城市。这个问题可以通过状态压缩的广度优先搜索来解决。
  • 状态表示:使用一个整数mask来表示已访问的城市集合,其中每一位表示对应的城市是否被访问过。
  • 费用计算:对于每条路,检查mask中的特定位是否为1,来决定费用是P还是R。
  • 记忆化搜索:记录到达每个城市和每个mask状态时的最小费用,避免重复计算。
  • 解决代码

    #include 
    #include
    #include
    #include
    using namespace std;int main() { int n, m; vector
    > edges; // edges[p]存储从p出发的所有路的信息 // 读取输入 scanf("%d%d", &n, &m); for (int p = 1; p <= m; p++) { int v, c, P, R; scanf("%d%d%d%d", &v, &c, &P, &R); edges[p].push_back({v, c, P, R}); } // 初始化记忆化数组 vector
    memo[n+1][1 << n]; queue
    > q; // 起点是城市1,已访问过,费用为0 memo[1][1 << 0] = 0; q.push({1, 1 << 0, 0}); int ans = INT_MAX; while (!q.empty()) { auto current = q.front(); q.pop(); int u = current.first; int mask = current.second; int cost = current.third; // 如果到达终点,更新答案 if (u == n) { if (cost < ans) ans = cost; continue; } // 遍历所有从u出发的路 for (auto& edge : edges[u]) { int v = edge[0]; // 下一个城市 int c = edge[1]; // 需要检查的城市 int P = edge[2]; // P费用 int R = edge[3]; // R费用 // 计算费用 if (mask & (1 << (c-1))) { int fee = P; new_cost = cost + fee; } else { int fee = R; new_cost = cost + fee; } int new_mask = mask | (1 << (v-1)); if (new_cost < memo[v][new_mask]) { memo[v][new_mask] = new_cost; q.push({v, new_mask, new_cost}); } } } if (ans != INT_MAX) { printf("%d", ans); } else { puts("impossible"); } return 0;}

    代码解释

  • 输入处理:读取城市数n和路数m,然后读取每条路的信息,存储在edges数组中。
  • 初始化:使用一个二维数组memo记录到达每个城市和每个mask状态时的最小费用。起点城市1已访问,费用为0。
  • 广度优先搜索:使用队列处理每个状态,检查从当前城市出发的所有路,计算费用并更新状态。
  • 费用计算:根据mask检查是否已经访问过特定城市,决定费用为P或R,更新新的mask状态。
  • 记忆化:避免重复计算,记录到达每个状态的最小费用,继续处理下一个状态。
  • 通过这种方法,我们可以高效地找到从城市1到城市n的最小费用路径。

    转载地址:http://tfxfk.baihongyu.com/

    你可能感兴趣的文章
    PostgreSQL 同步流复制锁瓶颈分析
    查看>>
    PostgreSQL 备份与还原命令 pg_dump
    查看>>
    Postgresql 外部表插件postgres_fdw的安装和使用
    查看>>
    PostgreSQL 如何从崩溃状态恢复(上)
    查看>>
    PostgreSQL 存储过程基本语法
    查看>>
    PostgreSQL 实现批量更新、删除、插入
    查看>>
    PostgreSQL 导入 .gz 备份文件
    查看>>
    PostgreSQL 批量插入&更新数据时报错(ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time)
    查看>>
    PostgreSQL 新增数据返回自增ID
    查看>>
    postgresql 更新多列数据
    查看>>
    PostgreSQL 服务启动后停止
    查看>>
    PostgreSQL 辟谣存在任意代码执行漏洞:消息不实
    查看>>
    PostgreSQL+PostGIS实现两坐标点之间最短路径查询算法函数(地图工具篇.12)
    查看>>
    Qt开发——简易调色板QPalette
    查看>>
    PostgreSQL-解决连接时遇到的乱码问题
    查看>>
    PostgreSQL15.2最新版本安装_远程连接_Navicat操作_pgAdmin操作_Windows10上安装---PostgreSQL工作笔记001
    查看>>
    PostgreSQL9.1 双机部署配置(主备数据同步)
    查看>>
    Qt开发——简易网络浏览器(一)
    查看>>
    Qt开发——简易成绩登记系统
    查看>>
    Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句
    查看>>