2 条题解

  • 1
    @ 2025-3-6 14:49:51

    没有注释 没有题解 只有代码 spfa

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <queue>
    #include <deque>
    #include <unordered_map>
    #include <map>
    #include <cstring>
    #include <cmath>
    #include <unordered_set>
    #include <set>
    #include <utility>
    #include <climits>
    #include <iomanip>
    #include <stack>
    
    #define int long long
    #define PII pair<int, int> 
    #define inf 0x3f3f3f3f
    #define all(v) v.begin() , v.end()
    
    using namespace std;
    const int N = 2e6 + 10;
    int e[N] , ne[N] , h[N] , rh[N] , idx , price[N];
    bool st[N];
    int dmin[N] , dmax[N];
    int n , m;
    
    void add(int *h , int a , int b)
    {
        e[idx] = b , ne[idx] = h[a] , h[a] = idx ++;
    }
    
    void spfa(int *dist , int *h , int start , bool flag)
    {
        if (flag) memset(dist , 0x3f , sizeof dmin);
    
        memset(st , false , sizeof st);
        dist[start] = price[start];
        st[start] = true;
        queue<int> q;
        q.push(start);
    
        while (q.size())
        {
            int t = q.front();
            q.pop();
    
            st[t] = false;
    
            for (int i = h[t] ; ~i ; i = ne[i])
            {
                int j = e[i];
                if (flag && dist[j] > min(dist[t] , price[j]) || !flag && dist[j] < max(dist[t] , price[j]))
                {
                    if (flag) dist[j] = min(dist[t] , price[j]);
                    else dist[j] = max(dist[t] , price[j]);
    
                    if (!st[j])
                    {
                        st[j] = true;
                        q.push(j);
                    }
                }            
            }
        }
    
    }
    
    void solve()
    {
        int n , m;
        cin >> n >> m;
        for (int i = 1 ; i <= n ; i ++ ) cin >> price[i];
    
        memset(h , -1 , sizeof h) , memset(rh , -1 , sizeof rh);
    
        for (int i = 1 ; i <= m ; i ++ )
        {
            int a , b , c;
            cin >> a >> b >> c;
            add(h , a , b) , add(rh , b , a);
            if (c == 2) add(h , b , a) , add(rh , a , b);
        }
    
        spfa(dmin , h , 1 , true);
        spfa(dmax , rh , n , false);
    
        int ans = 0;
        for (int i = 1 ; i <= n ; i ++ ) ans = max(ans , dmax[i] - dmin[i]);
    
        cout << ans << endl;
    }
    
    signed main() 
    {
        ios::sync_with_stdio(false);
        cin.tie(nullptr), cout.tie(nullptr);
    
        solve();
        return 0;
    }
    

    「一本通 3.2 练习 5」最优贸易

    信息

    ID
    1435
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    (无)
    递交数
    3
    已通过
    7
    上传者