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;
    }
    
    • 0
      @ 2025-2-14 16:27:15

      建立正反图,枚举每个点为终点,正图算出到这个点最小购入价格,反图算出到这个点最大卖出价格,枚举以每个点为终点两者相减的价格更新最大值

      #include<bits/stdc++.h>
      // #define int long long //memset数组为0x3f时自觉去掉
      #define INF 0x3f3f3f3f
      #define PII pair<int,int>
      #define ULL unsigned long long
      #define PIII tuple<int,int,int>
      #define all(v) v.begin(), v.end()
      #define debug(a) cout<<#a<<"="<<a<<endl;
      using namespace std;
      constexpr int N =  100000 + 10,M = 2 * 500000 + 10;
      
      int n,m;
      int w[N];
      bool vis[N];
      int dmin[N],dmax[N];
      vector<int> Gmin[M],Gmax[M];
      void Spfa(vector<int> G[],int dist[],int type)
      {
          queue<int> q;
          if(type == 0)
          {
              memset(dist,0x3f,sizeof dmin);
              q.push(1);
              dist[1] = w[1];
              vis[1] = 1;
          }
          else
          {
              memset(dist,-0x3f,sizeof dmax);
              q.push(n);
              dist[n] = w[n];
              vis[n] = 1;
          }
      
          while(q.size())
          {
              int u = q.front();
              q.pop();
              vis[u] = 0;
              for(int v : G[u])
              {
                  if(type == 0 && min(dist[u],w[v]) < dist[v] || type == 1 && max(dist[u],w[v]) > dist[v])
                  {
                      if(type == 0) dist[v] = min(dist[u],w[v]);
                      else dist[v] = max(dist[u],w[v]);
                      if(vis[v]) continue;
                      vis[v] = 1;
                      q.push(v);
                  }
              }
          }
      }
      void solve()
      {
          cin >> n >> m;
          for(int i=1;i<=n;i++) cin >> w[i];
          while(m--)
          {
              int x,y,z;
              cin >> x >> y >> z;
              Gmin[x].emplace_back(y);
              Gmax[y].emplace_back(x);
              if(z == 2)
              {
                  Gmin[y].emplace_back(x);
                  Gmax[x].emplace_back(y);
              }
          }
      
          Spfa(Gmin,dmin,0);
          Spfa(Gmax,dmax,1);
      
          int ans = 0;
          for(int i=1;i<=n;i++) ans = max(dmax[i] - dmin[i],ans);
      
          cout << ans;
      }
      signed main()
      {
          ios::sync_with_stdio(0);cin.tie(nullptr),cout.tie(nullptr);
          int _=1;
          // cin>>_;
          while(_--)
          {
              solve();
          }
          return 0;
      }
      
      /**
       *    author: Nijika_jia
       *    created: 2025.02.14 14:40:56
       */
      
      • 1

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

      信息

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