hdu 3038 - How Many Answers Are Wrong(并查集)
2013-10-23 12:55
609 查看
题意:
已知多个描述,每个描述都给出一个区间的它的和,求这些描述中错误描述的个数。
思路:
思路和poj1733差不多,就是把利用并查集把所有区间的起点和终点都放到集合里面,其中s[x]用来表示区间(p[x], x]的和,其他合并区间和路径压缩的公式也很好推,具体的见代码。
另外需要说的是:杭电坑爹,任何题目都要写成多case。。。
代码如下:
已知多个描述,每个描述都给出一个区间的它的和,求这些描述中错误描述的个数。
思路:
思路和poj1733差不多,就是把利用并查集把所有区间的起点和终点都放到集合里面,其中s[x]用来表示区间(p[x], x]的和,其他合并区间和路径压缩的公式也很好推,具体的见代码。
另外需要说的是:杭电坑爹,任何题目都要写成多case。。。
代码如下:
const int M = 200005; int p[M], s[M]; int find(int x) { int tmp = p[x]; p[x] = (p[x] == x ? x : find(p[x])); s[x] += s[tmp]; return p[x]; } int main() { int n, m, a, b, tmp, ans = 0; while(~scanf("%d%d", &n, &m)) { ans = 0; for(int i = 0; i <= n; ++i) p[i] = i, s[i] = 0; for(int i = 0; i < m; ++i) { scanf("%d%d%d", &a, &b, &tmp); int x = find(a-1); int y = find(b); if(x == y && s[b] - s[a-1] != tmp) ++ans; else if(x != y) { if(x>y) { p[x] = y; s[x] = s[b] - s[a-1] - tmp; } else { p[y] = x; s[y] = s[a-1] - s[b] + tmp; } } } printf("%d\n", ans); } return 0; }
相关文章推荐
- HDU 3038 How Many Answers Are Wrong(带权并查集)
- HDU---3038(How Many AnswersAre 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 带权并查集
- How Many Answers Are Wrong hdu 3038 (带权并查集)
- 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(并查集和偏移向量)
- hdu 3038D - How Many Answers Are Wrong [kuangbin带你飞]专题五 并查集
- 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 并查集带权路径压缩