HDU-3038-How Many Answers Are Wrong [带权并查集]
2017-07-25 09:44
148 查看
题目传送门
题意:
每输入一行x y s,表示[x,y]的和为s,求有多少行与前面的有冲突。
思路:
可以理解为y比x-1大s,就可以用带权并查集做。
题意:
每输入一行x y s,表示[x,y]的和为s,求有多少行与前面的有冲突。
思路:
可以理解为y比x-1大s,就可以用带权并查集做。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> #include <queue> using namespace std; int N,M; int fa[200000+100], sum[200000+100]; void init() { for (int i = 0; i < 200000; i++) { fa[i]=i; sum[i]=0; } return ; } int find(int x) { if (x==fa[x])return x; int t = fa[x]; fa[x] = find(fa[x]); sum[x] += sum[t]; return fa[x]; } int main(void) { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while (~scanf("%d %d", &N, &M)) { init(); int ans = 0; while (M--) { int x, y, s; scanf("%d %d %d", &x, &y, &s); x--; int a = find(x); int b = find(y); if (a==b && sum[x]!=sum[y]+s) { ans++; } else { if (a>b) { fa[b] = a; sum[b] = sum[x]-s-sum[y]; } else { fa[a] = b; sum[a] = sum[y]+s-sum[x]; } } } printf("%d\n",ans); } return 0; }
相关文章推荐
- hdu 3038 How Many Answers Are Wrong (带权并查集)
- hdu 3038 How Many Answers Are Wrong(带权并查集)
- HDU 3038 How Many Answers Are Wrong(带权并查集)
- HDU - 3038 How Many Answers Are Wrong (带权并查集)
- hdu 3038 How Many Answers Are Wrong(带权并查集)
- HDU 3038 How Many Answers Are Wrong (带权并查集+区间判断)
- HDU 3038 How Many Answers Are Wrong (并查集路径压缩)
- hdu 3038 How Many Answers Are Wrong(带权并查集)
- HDU 3038 How Many Answers Are Wrong(并查集)
- hdu 3038 How Many Answers Are Wrong【并查集的简单应用】
- hdu 3038 How Many Answers Are Wrong(并查集)
- hdu 3038 How Many Answers Are Wrong(带权并查集+树的性质)
- HDU 3038 How Many Answers Are Wrong(带权并查集)
- hdu 3038 - How Many Answers Are Wrong(并查集)
- 【HDU 3038】 How Many Answers Are Wrong (带权并查集)
- HDU 3038 How Many Answers Are Wrong(并查集)
- hdu 3038 How Many Answers Are Wrong(带权并查集)
- D - How Many Answers Are Wrong HDU - 3038(带权并查集)
- hdu 3038 How Many Answers Are Wrong【并查集的简单应用】
- HDU - 3038 How Many Answers Are Wrong (带权并查集)