题目:给出网络中的边,查询节点的连接状态。
分析:简单题、并查集。
注意:数据读入出错会RE。
#include <iostream>
#include <stdlib.h>
#include <cstring>
#include <stdio.h>
#include <stack>
using namespace std;
char E[ 3 ];
//union_set__begin
int sets[ 10005 ];
int rank[ 10005 ];
void union_set( int s, int t ) {
for ( int i = s ; i <= t ; ++ i ) {
sets[i] = i;
rank[i] = 0;
}
}
void Union( int a, int b ) {
if ( rank[a] > rank[b] )
sets[b] = a;
else {
sets[a] = b;
if ( rank[a] == rank[b] )
rank[b] ++;
}
}
int Find( int a ) {
if ( a != sets[a] )
sets[a] = Find( sets[a] );
return sets[a];
}
//union_set__end
int main()
{
int n,m,a,b,A,B;
while ( scanf("%d\n",&n) != EOF ) {
while ( n -- ) {
int v1 = 0,v2 = 0;
scanf("%d\n",&m);
union_set( 1, m );
while ( E[0] = getchar() ) {
if ( E[0] == '\n' || E[0] == EOF ) break;
scanf("%d%d",&a,&b);
getchar();
A = Find(a);
B = Find(b);
if ( E[0] == 'c' ) {
if ( A != B )
Union( A, B );
}else {
if ( A != B ) ++ v2;
else ++ v1;
}
}
printf("%d,%d\n",v1,v2);
if ( n ) printf("\n");
}
}
return 0;
}