您的位置:首页 > 其它

并查集 之 CODE[VS] 1073 家族

2015-12-13 18:09 344 查看
/*
并查集
*/


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstddef>
#include <iterator>
#include <algorithm>
#include <string>
#include <locale>
#include <cmath>
#include <vector>
#include <cstring>
#include <map>
#include <utility>
#include <queue>
#include <stack>
#include <set>
#include <functional>
using namespace std;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int modPrime = 3046721;
const double eps = 1e-9;
const int MaxN = 5010;
const int MaxM = 5010;

int N, M, P;
/******************************************/
// 并查集:Union-Find Sets
int ftr[MaxN];
int rnk[MaxN];
void ufsIni(int n)
{
for (int i = 0; i <= n; ++i)
{
ftr[i] = i;
}
}

int ufsFind(int x)
{
if (x == ftr[x])
{
return x;
}
return ftr[x] = ufsFind(ftr[x]);
}

void ufsUnite(int x, int y)
{
x = ufsFind(x);
y = ufsFind(y);
if (x == y)
{
return;
}

if (rnk[x] < rnk[y])
{
ftr[x] = y;
}
else
{
ftr[y] = x;
if (rnk[x] == rnk[y])
{
++rnk[x];
}
}
}

bool ufsSame(int x, int y)
{
return (ufsFind(x) == ufsFind(y));
}

/******************************************/

void Solve()
{
ufsIni(N);
int x, y;
for (int i = 0; i < M; ++i)
{
scanf("%d %d", &x, &y);
ufsUnite(x, y);
}
for (int i = 0; i < P; ++i)
{
scanf("%d %d", &x, &y);
if (ufsSame(x, y))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
}

int main()
{
#ifdef HOME
freopen("in", "r", stdin);
//freopen("out", "w", stdout);
#endif

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

#ifdef HOME
cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
_CrtDumpMemoryLeaks();
#endif
return 0;
}





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: