BZOJ#1202[HNOI2005]狡猾的商人

[HNOI2005]狡猾的商人

image

思路:

带权并查集模板题

代码:

#include <bits/stdc++.h>
#define int long long
int _= 0, Case = 1;
using namespace std;
#define all(v) begin(v),end(v)
#define nline '\n'

const int N=100010;
int n,m;
int p[N],d[N];
bool ok=true;
int find(int x){
    if(p[x]!=x){
        int root=find(p[x]);
        d[x]+=d[p[x]];
        p[x]=root;
    }
    return p[x];
}
void merge(int a, int b,int w) {
    int pa = find(a), pb = find(b);
    if(pa==pb){
        if(d[b]-d[a]!=w) ok=false;
    }
    if (pa != pb) {
        p[pb]=pa;
        d[pb]=d[a]-(d[b]-w);
    }
}
void solve(int Case) {
    cin>>n>>m;
    ok=true;
    for(int i=0;i<=n;i++) p[i]=i,d[i]=0;
    for(int i=1;i<=m;i++){
        int l,r,w;
        cin>>l>>r>>w;
        merge(l-1,r,w);

    }
    if(ok) cout<<"true"<<nline;
    else cout<<"false"<<nline;
}

signed main() {
    ios::sync_with_stdio(false); cin.tie(nullptr);
    cin >> _; for (Case = 1; Case <= _; Case++)
        solve(Case);

    return 0;
}
posted @ 2022-03-30 19:21  指引盗寇入太行  阅读(26)  评论(0编辑  收藏  举报