
tag[i] 表示 i 结点 与其父节点是否在同一个集合中(表示的是一种相对关系)
GetFather时:压缩路径,同时更新tag[i]
合并时:更新tag[father[i]]
#include <stdio.h>
#include <iostream>
#include <stack>
#include <string>
#include <set>
#include <memory.h>
#include <math.h>
#include <algorithm>
#include <queue>
using namespace std;
int father[100005], N, M, T, tag[100005];
void Init()
{
for( int i = 1; i <= N; i++ )
father[i] = i;
for( int i = 1; i <= N; i++ )
tag[i] = 0;
}
int GetFather( int i )
{
if( i == father[i] )
return i;
int tmp = GetFather( father[i] );
tag[i] = (tag[i] + tag[father[i]]) % 2;
father[i] = tmp;
return tmp;
}
int main()
{
scanf("%d", &T);
while( T-- )
{
scanf("%d %d", &N, &M);
Init();
char c;
int tmpa,

本文探讨了并查集这一数据结构,重点介绍了如何利用tag属性来判断节点是否属于同一集合,以及在获取父节点(GetFather)时进行路径压缩和tag值更新的操作。在集合合并过程中,也会相应更新父节点的tag信息。
2175

被折叠的 条评论
为什么被折叠?



