HDU 3038 How Many Answers Are Wrong 并查集带权路径压缩
2013-07-19 22:39
531 查看
思路跟 LA 6187 完全一样。
我是乍一看没反应过来这是个并查集,知道之后就好做了。
d[i]代表节点 i 到根节点的距离,即每次的sum。
我是乍一看没反应过来这是个并查集,知道之后就好做了。
d[i]代表节点 i 到根节点的距离,即每次的sum。
#include <cstdio> #include <cstring> #include <cstdlib> const int MAXN = 200010; int N, Q; int p[MAXN]; int d[MAXN]; int FindSet( int x ) { if ( p[x] == x ) return x; int root = FindSet( p[x] ); d[x] += d[ p[x] ]; return p[x] = root; } int main() { while ( ~scanf( "%d%d", &N, &Q ) ) { for ( int i = 0; i <= N; ++i ) { d[i] = 0; p[i] = i; } int cnt = 0; while ( Q-- ) { int a, b, sum; scanf( "%d%d%d", &a, &b, &sum ); --a; int u = FindSet( a ); int v = FindSet( b ); if ( u == v ) { if ( sum != d[b] - d[a] ) ++cnt; } else { p[v] = u; d[v] = d[a] - d[b] + sum; } } printf( "%d\n", cnt ); } 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[并查集]
- D - How Many Answers Are Wrong HDU - 3038 带权并查集
- hdu 3038 How Many Answers Are Wrong (种类并查集)
- hdu 3038 How Many Answers Are Wrong(并查集变种)
- 杭电hdu 3038 how many answers are wrong 并查集求解
- hdu3047 Zjnu Stadium && 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)+3047(Zjnu Stadium)(种类并查集)
- HDU-3038 How Many Answers Are Wrong 并查集
- HDU 3038 - How Many Answers Are Wrong(带权的并查集,其实俺真不知道为啥带权,俺只知道多了个父子关系)