您的位置:首页 > 其它

并查集练习2:HDOJ1232

2017-04-27 15:21 363 查看
建立权重并查集,水过。

可以直接写while(cin >> N),感觉比C的!EOF好用。

#include <iostream>

using namespace std;
int findroot(int a) ;
void unionroot(int a, int b) ;

int city[1005] ;
int weight[1005] ;

int main()
{
int N = 0 ,M = 0 ;
int a =0 , b = 0 ;
int result = 0;
while(cin >> N)
{
if(N==0)
break;
cin >> M ;
for(int i = 1; i<=N ; i++)
{
city[i] = i ;
weight[i] = 1 ;
}
result = 0 ;
while(M--)
{
cin >> a >> b ;
int roota = 0 ,rootb = 0 ;
roota = findroot(a) ;
rootb = findroot(b) ;
if(roota != rootb)
unionroot(roota, rootb);
}
for(int i = 1; i<=N ; i++)
{
if(city[i]==i)
result++ ;
}
cout << result -1 << endl ;
}
return 0;
}

int findroot(int a)
{
while(a!=city[a])
{
a = city[a] ;
}

return a ;
}

void unionroot(int a, int b)
{
if(weight[a]>weight[b])
{
city[b] = a ;
weight[a]+=weight[b] ;
}
else
{
city[a] = b ;
weight[b]+=weight[a] ;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: