1 条题解

  • 2
    @ 2024-6-13 3:15:48

    【解题思路】:发现不管通过什么方式换,最终因为价值不同而花费的金币数都是固定的,即 v[b]-v[a],a 为持有的商品,b 为希望获得商品,唯一的区别是每次交易都要额外支付 1 块钱,所以需要最小化交易次数,我们把每件商品看作 1 个点,如果某件商品 x 能够换为某件商品 y,则让 x 和 y 连一条边,我们的目标是从商品 a 出发尽快到达商品 b,即经过的边的数量尽量少,可以通过 bfs 求经过的最少的边数,设这个值为 min_dist[dst],那么最终答案为min_dist[dst]+v[b]-v[a]。

    【参考程序】:

    #include <bits/stdc++.h>
    using namespace std;
    
    int n;
    vector<int> edge[100010];
    int val[100010];
    
    int min_dist[100010];
    int que[100010], qh, qt;
    
    void bfs(int src)
    {
        qh = qt = 0;
        memset(min_dist, 127, sizeof(min_dist));
        que[++qt] = src;
        min_dist[src] = 0;
        while (qh < qt)
        {
            int u = que[++qh];
            for (auto v : edge[u])
            {
                if (min_dist[u] + 1 < min_dist[v])
                {
                    min_dist[v] = min_dist[u] + 1;
                    que[++qt] = v;
                }
            }
        }
    }
    
    int main()
    {
        int m, src, dst;
        cin >> n >> m >> src >> dst;
        for (int i = 0; i < n; ++i)
        {
            cin >> val[i];
        }
        for (int i = 0; i < m; ++i)
        {
            int x, y;
            cin >> x >> y;
            edge[x].push_back(y);
        }
        bfs(src);
        if (min_dist[dst] > n)
        {
            cout << "No solution\n";
        }
        else
        {
            cout << min_dist[dst] - val[src] + val[dst] << "\n";
        }
        return 0;
    }
    
    • 1

    [GESP202312 七级] 商品交易

    信息

    ID
    581
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    21
    已通过
    10
    上传者