吃菠萝的狼 2024-05-25 17:25 采纳率: 66.7%
浏览 4
已结题

c++2959 问题 L: 卡车运输

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-25 17:25
    关注

    引自免费微信小程序:皆我百晓生

    题目描述: 在城市中有n个仓库,编号为1到n,每个仓库都有一定数量的货物,表示为数组v。同时,有m条道路连接这些仓库,每条道路由两个整数u, v表示从仓库u到仓库v有一条双向道路。你需要将所有仓库中的货物运送到一个指定的目标仓库t。每次可以使用一辆卡车运输,卡车可以从任意一个仓库出发,并且只能沿道路行驶,最终到达目标仓库t。每辆卡车的最大载货量是相同的,表示为整数W。

    你的任务是计算至少需要多少辆卡车才能完成所有的货物运输。

    解题思路: 这是一个典型的网络流问题,可以通过求最小割(Minimum Cut)或者最大流(Maximum Flow)的方法解决。这里我们采用 Ford-Fulkerson 算法实现最大流,找到从各个仓库到目标仓库t的最大可能流量,然后将这个流量除以每辆车的最大载货量W,向上取整得到所需的最少卡车数量。

    以下是C++代码实现:

    #include <iostream>
    #include <vector>
    #include <queue>
    #include <algorithm>
    
    using namespace std;
    
    const int INF = 1e9;
    const int MAX_VERTICES = 10005;
    vector<pair<int, int>> graph[MAX_VERTICES];
    int flow[MAX_VERTICES][MAX_VERTICES];
    
    void add_edge(int u, int v, int capacity) {
        graph[u].push_back({v, capacity});
        graph[v].push_back({u, 0}); // 双向边
    }
    
    bool bfs(int source, int sink) {
        vector<bool> visited(MAX_VERTICES, false);
        queue<int> q;
        q.push(source);
        visited[source] = true;
    
        while (!q.empty()) {
            int current = q.front();
            q.pop();
    
            for (auto &edge : graph[current]) {
                int next = edge.first;
                int residual_capacity = edge.second - flow[current][next];
    
                if (!visited[next] && residual_capacity > 0) {
                    q.push(next);
                    visited[next] = true;
                    flow[current][next] += residual_capacity;
                    flow[next][current] -= residual_capacity;
                }
            }
        }
    
        return visited[sink];
    }
    
    int dfs(int current, int sink, int remaining_capacity) {
        if (current == sink || remaining_capacity == 0)
            return remaining_capacity;
    
        int max_flow = 0;
    
        for (auto &edge : graph[current]) {
            int next = edge.first;
            int residual_capacity = edge.second - flow[current][next];
    
            if (residual_capacity > 0 && !flow[next][current]) { // 非饱和边
                int new_flow = dfs(next, sink, min(residual_capacity, remaining_capacity));
                if (new_flow > 0) {
                    flow[current][next] += new_flow;
                    flow[next][current] -= new_flow;
                    max_flow += new_flow;
                    remaining_capacity -= new_flow;
                }
            }
        }
    
        return max_flow;
    }
    
    int max_flow(int source, int sink) {
        int max_flow = 0;
        while (bfs(source, sink)) {
            max_flow += dfs(source, sink, INF);
        }
        return max_flow;
    }
    
    int main() {
        int n, m, t, W;
        cin >> n >> m >> t >> W; // 输入仓库数量、道路数量、目标仓库编号和每辆车的最大载货量
    
        for (int i = 0; i < m; i++) {
            int u, v;
            cin >> u >> v; // 输入道路的起点和终点
            add_edge(u, v, INF); // 添加道路并设置无限容量
        }
    
        // 初始化每辆卡车能装载的货物总量
        int total_load = 0;
        for (int i = 1; i <= n; i++) {
            int vi;
            cin >> vi; // 输入仓库i的货物量
            total_load += vi;
        }
    
        // 设置源节点为1,所有仓库作为中间节点,目标节点为t+1
        for (int i = 1; i <= n; i++) {
            add_edge(0, i, vi); // 从源节点到每个仓库
        }
        add_edge(n + 1, t + 1, INF); // 从目标仓库t到目标节点t+1
    
        int max_capacity = max_flow(0, t + 1); // 计算最大流
        int trucks_needed = ceil((double)total_load / max_capacity); // 计算最少卡车数量
    
        cout << trucks_needed << endl;
    
        return 0;
    }
    

    这段代码首先读入输入数据,然后构建图结构,接着调用Ford-Fulkerson算法计算最大流,最后根据总货物量和最大流计算出最少需要的卡车数量。注意,在计算最少卡车数量时,我们需要使用ceil()函数向上取整,因为卡车的数量必须是整数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月31日
  • 已采纳回答 7月23日
  • 创建了问题 5月25日

悬赏问题

  • ¥15 TeleScan不能修改bar
  • ¥100 请问我基于逐飞库写的这个有关于mp u6050传感器的函数,为什么输出的值是固定的?
  • ¥15 hadoop中启动hive报错如下怎么解决
  • ¥15 如何优化QWebEngineView 加载url的速度
  • ¥15 关于#hadoop#的问题,请各位专家解答!
  • ¥15 如何批量抓取网站信息
  • ¥15 Spring Boot离线人脸识别
  • ¥15 使用Ant Design Pro vue的时候,使用环境变量的时候,构建报错是什么原因
  • ¥15 NRF24L01能发送但是不能接收
  • ¥15 想问一下这种情况怎么解决呢(关键词-file)