HDU 3038 How Many Answers Are Wrong
2013-12-20 15:07
260 查看
带权并查集
#include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <fstream> #include <string> #include <vector> #include <queue> #include <stack> #include <map> #include <set> #include <algorithm> #include <functional> #define eps 1e-8 #define pi acos(-1.0) #define inf 0x3f3f3f3f #define INF 0x3f3f3f3f3f3f3f3fLL #define _clr(x,a) memset(x,a,sizeof(x)) #define min(a,b)) (a)<(b)?(a):(b) #define max(a,b) (a)>(b)?(a):(b) #define rep(i,n) for(int i=1;i<=n;++i) using namespace std; //#define sponge_wxy_code const int MAXN = 200010; int parent[MAXN], sum[MAXN]; int n, m; void init_set() { for(int i = 1; i <= n+1; ++i) { parent[i] = -1; sum[i] = 0; } return ; } int find_set(int u) { if(parent[u] < 0) return u; int temp = parent[u]; parent[u] = find_set(parent[u]); sum[u] = sum[u] + sum[temp]; return parent[u]; } void union_set(int r1, int r2, int u, int v, int val) { if(r1 < r2) { sum[r2] = sum[u] + val - sum[v]; parent[r1] += parent[r2]; parent[r2] = r1; } else { sum[r1] = sum[v] - sum[u] - val; parent[r2] += parent[r1]; parent[r1] = r2; } return ; } int main() { #ifdef sponge_wxy_code freopen("aa.in", "r", stdin); freopen("bb.out", "w", stdout); #endif int u, v, val, ans; while(scanf("%d %d", &n, &m) != EOF) { init_set(); ans = 0; //rep(i, n) printf("%d ", parent[i]); //printf("\n"); while(m--) { scanf("%d %d %d", &u, &v, &val); v++; int r1 = find_set(u), r2 = find_set(v); if(r1 == r2) { if(sum[v] - sum[u] != val) ans++; } else { union_set(r1, r2, u, v, val); } } printf("%d\n", ans); } return 0; }
相关文章推荐
- How Many Answers Are Wrong HDU - 3038
- 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 (并查集)---并查集看不出来系列-1
- 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(并查集)
- 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(带权并查集)
- hdu 3038 How Many Answers Are Wrong(带权并查集)
- HDU 3038 How Many Answers Are Wrong(带权并查集)
- hdu 3038 How Many Answers Are Wrong