题目:求分图个数。
分析:简单题、并查集。
注意:数据读入方式出错会出现RE或TLE。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <stack>
using namespace std;
char M[ 2 ],E[ 3 ];
class union_set
{
private:
int sets[ 26 ];
int rank[ 26 ];
public:
union_set( int n ) {
for ( int i = 0 ; i <= n ; ++ 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];
}
int Count( int n ) {
int count = 0;
for ( int i = 0 ; i <= n ; ++ i )
if ( sets[i] == i )
++ count;
return count;
}
};
int main()
{
int n,a,b;
while ( cin >> n ) {
getchar();
getchar();
while ( n -- ) {
gets(M);
union_set US(M[0]-'A');
while ( gets(E) ) {
if ( !E[0] ) break;
a = US.Find(E[0]-'A');
b = US.Find(E[1]-'A');
if ( a != b )
US.Union( a, b );
}
printf("%d\n",US.Count(M[0]-'A'));
if ( n ) printf("\n");
}
}
return 0;
}