abc087d <并查集 维护距离信息>
题目
思路
- 使用并查集, 维护节点与父节点信息, 检查兼容性
总结
- 注意维护距离信息的并查集的
find
的写法
int find(int x)
{
if (x != fa[x])
{
int t = fa[x];
fa[x] = find(fa[x]);
dis[x] += dis[t];
}
return fa[x];
}
union
时, 画图整理distance
更新公式, 以防出错
代码
Code
// https://atcoder.jp/contests/abc087/tasks/arc090_b
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
using LL = long long;
const int N = 1e5 + 10;
int fa[N];
int dis[N];
int find(int x)
{
if (x != fa[x])
{
int t = fa[x];
fa[x] = find(fa[x]);
dis[x] += dis[t];
}
return fa[x];
}
void solv()
{
int n, m, l, r, d;
cin >> n >> m;
for (int i = 1; i <= n; i ++) fa[i] = i;
bool flag = true;
while (m --)
{
cin >> l >> r >> d;
int fl = find(l), fr = find(r);
if (fl != fr)
{
fa[fr] = fl;
dis[fr] = d + dis[l] - dis[r];
}
else if (dis[l] + d != dis[r])
flag = false;
}
cout << (flag? "Yes": "No") << endl;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T = 1;
// cin >> T;
while (T --)
{
solv();
}
return 0;
}
本文来自博客园,作者:O2iginal,转载请注明原文链接:https://www.cnblogs.com/o2iginal/p/17555943.html