2 条题解

  • 0
    @ 2025-10-8 17:03:24
    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define ull unsigned long long
    #define INF 0x3f3f3f3f
    #define lowbit(x) (x & -x)
    #define pii pair<int, int>
    #define N 1000010
    int T, n, m;
    
    int dad[N];
    ll dst[N];// 父节点和距离
    bool flag;// 答案
    int s, t, fs, ft;
    ll w;
    
    int find(const int &x) {
        if (dad[x] == x) return x;
        int tmp = dad[x];
        dad[x] = find(dad[x]);
        dst[x] += dst[tmp];
        return dad[x];
    }
    
    inline void merge(int x, int y, const ll &w) {
        // x 和 y 已经找好了
        dad[x] = y;
        dst[x] = w;
    }
    
    // 输入函数
    void input() {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n + 1; ++i) dad[i] = i, dst[i] = 0;
        flag = 0;
    }
    
    // 处理函数
    void solve() {
        while (m--) {
            scanf("%d%d%lld", &s, &t, &w);
            ++t;
            // 合并
            fs = find(s), ft = find(t);
            if (fs == ft) {
                if (dst[s] - dst[t] != w) flag = 1; // 不合法
                continue;
            }
            // 合并
            merge(ft, fs, dst[s] - w - dst[t]);
        }
    }
    
    // 输出函数
    void output() {
        if (flag) printf("False\n");
        else printf("True\n");
    }
    
    // 主函数
    int main() {
        scanf("%d", &T);
        while (T--) {
            input();
            solve();
            output();
        }
        
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:03:06
      #include<bits/stdc++.h>
      using namespace std;
      #define ll long long
      #define ull unsigned long long
      #define INF 0x3f3f3f3f
      #define lowbit(x) (x&-x)
      #define pii pair<int,int>
      #define N 1000010
      int T,n,m;
      
      int dad[N];
      ll dst[N];// 父节点和距离
      bool flag;// 答案
      int s,t,fs,ft;
      ll w;
      
      int find(const int &x){
          if(dad[x] == x)return x;
          int tmp = dad[x];
          dad[x] = find(dad[x]);
          dst[x] += dst[tmp];
          return dad[x];
      }
      
      inline void merge(int x,int y,const ll &w){
          // x 和 y 已经找好了
          dad[x] = y;
          dst[x] = w;
      }
      
      // 输入函数
      void input(){
          scanf("%d%d",&n,&m);
          for(int i = 1;i <= n+1;++i)dad[i] = i,dst[i] = 0;
          flag = 0;
      }
      
      // 处理函数
      void solve(){
          while(m--){
              scanf("%d%d%lld",&s,&t,&w);
              ++t;
              // 合并
              fs = find(s),ft = find(t);
              if(fs == ft){
                  if(dst[s] - dst[t] != w)flag = 1;// 不合法
                  continue;
              }
              // 合并
              merge(ft,fs,dst[s] - w - dst[t]);
          }
      }
      
      // 输出函数
      void output(){
          if(flag)printf("False\n");
          else printf("True\n");
      }
      
      // 主函数
      int main(){
          scanf("%d",&T);
          while(T--){
              input();
              solve();
              output();
          }
          
          return 0;
      }
      • 1

      【差分约束】[HNOI2005] 狡猾的商人

      信息

      ID
      2855
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      8
      已通过
      2
      上传者