HDU_3038_(并查集合并 线性加)
            
            
              
HDU 3038
- 加权并查集
 
- 题目描述有问题,有多组数据
 
- 子序列是连续的,路径压缩是权值相加就行,
 
- 根节点相同说明已经存在合理字段和,判断到根节点的距离是否满足 已经存在的和
 
- 不同则合并

 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
   | #include <iostream> #include <string.h>  using namespace std; const int maxn = 2e5+10; int pre[maxn]; int dist[maxn];
  void init() { 	memset(dist,0,sizeof dist); 	for (int i=1; i<maxn; i++) pre[i] = i; } int find(int x) { 	int temp = pre[x]; 	if (x == pre[x]) return x; 	pre[x] = find(pre[x]); 	dist[x] += dist[temp]; 	return pre[x]; }
  int main() {
  	int n,m; 	 	while (scanf("%d%d",&n,&m) != EOF) { 		init(); 		int ans = 0;  		while (m--) { 			int a,b,len; 			scanf("%d%d%d",&a,&b,&len); 			b++; 			int ra = find(a); 			int rb = find(b); 			if (ra == rb) { 				if (dist[a] - dist[b] != len)  					ans++; 			} 			else { 				pre[ra] = rb; 				dist[ra] = len + dist[b] - dist[a]; 			} 		} 		printf("%d\n",ans); 	} 	return 0; }
 
  |