杭电1829 并查集的应用

  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
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
      
      
#include<stdio.h>
#define max 2005
int father [ max ], Rank [ max ], sex [ max ], flag = 0 ;
int find_set ( int x )
{
if ( x != father [ x ])
father [ x ] = find_set ( father [ x ]);
return father [ x ];
}
void make_set ()
{
int i ;
for ( i = 1 ; i < max ; i ++ )
{
father [ i ] = i ;
Rank [ i ] = 0 ;
sex [ i ] = 0 ;
}
}
void Union ( int x , int y )
{
x = find_set ( x );
y = find_set ( y );
if ( x == y )
{
return ;
}
if ( Rank [ x ] > Rank [ y ])
{
father [ y ] = x ;
}
else
{
if ( Rank [ x ] == Rank [ y ])
Rank [ y ] ++ ;
father [ x ] = y ;
}
}
int main ()
{
void Union ( int x , int y );
int t , n , m , x , y , k , flag ;
scanf ( "%d" , & t );
for ( k = 1 ; k <= t ; k ++ )
{
flag = 0 ;
make_set ();
scanf ( "%d%d" , & n , & m );
while ( m -- )
{
scanf ( "%d%d" , & x , & y );
if ( flag )
continue ;
if ( find_set ( x ) == find_set ( y )) //判断x和y的父亲结点是不是一样,相同则说明x和y的性别是一样的
flag = 1 ;
else
{
if ( sex [ x ] != 0 )
Union ( sex [ x ], y ); //x之前已经有了对象,把x的之前的对象与现在的对象y进行合并,说明x的对象性别是一样的
else
sex [ x ] = y ; //x之前没有对象,则现在x的对象为y
if ( sex [ y ] != 0 )
Union ( sex [ y ], x );
else
sex [ y ] = x ;
}
}
printf ( "Scenario #%d: \n " , k );
if ( flag == 1 )
printf ( "Suspicious bugs found! \n\n " );
else
printf ( "No suspicious bugs found! \n\n " );
flag = 0 ;
}
return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值