BZOJ#1202[HNOI2005]狡猾的商人
[HNOI2005]狡猾的商人
思路:
带权并查集模板题
代码:
#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;
}