Poj1703并查集

体会其中精髓的递归路径压缩算法

 

// Poj 1703, wrote by Dream 2011/2/22

#include <iostream>

using namespace std;

int s[100002];

int f[100002];

int T, N, M;

 

void Union(int x, int y);

int FindFather(int x);

void PrintResult(int x, int y);

void AddRelation(int x, int y);

 

int main(int argc, char *argv[]) 

{

T = 0;

scanf("%d", &T);

for (int i = 0; i < T; ++i)

{

N = M = 0;

scanf("%d %d", &N, &M);

for (int k = 0; k <= N; ++k)

{

s[k] = k;

f[k] = 0;

}

char c = '/0';

int x = 0;

int y = 0; 

for (int j = 0; j < M; ++j)

{

scanf("/n%c %d %d", &c, &x, &y);

if (c == 'A')

{

PrintResult(x,y);

}

else // c == 'D'

{

AddRelation(x,y);

}

}

}

return 0; 

}

 

void AddRelation(int x, int y)

{

// x,y both have no message in f[]

if (f[x] == 0 && f[y] == 0)

{

f[y] = x;

f[x] = y;

}

else if (f[x] == 0)

{

f[x] = y;

Union(x,f[y]);

}

else if (f[y] == 0)

{

f[y] = x;

Union(y,f[x]);

}

else

{

Union(x,f[y]);

Union(y,f[x]);

}

}

void PrintResult(int x, int y)

{

if (FindFather(x) == FindFather(y))

{

printf("In the same gang./n");

}

else if (FindFather(x) == FindFather(f[y]))

{

printf("In different gangs./n");

}

else

{

printf("Not sure yet./n");

}

}

 

void Union(int x, int y)

{

x = FindFather(x);

y = FindFather(y);

if (x == y)

{

return;

}

s[y] = x;

}

 

//精髓的递归路径压缩算法

int FindFather(int x)

{

if (s[x] != x)

{

s[x] = FindFather(s[x]);

}

return s[x];

 

/*

这种写没有路径压缩,会导致超时

why the code here will TLE

if (s[x] != x)

{

return  FindFather(s[x]);

}

else

return s[x];

*/

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值