UVa 459 - Graph Connectivity

来源:互联网 发布:用友软件好学吗 编辑:程序博客网 时间:2024/04/27 02:39

题目:求分图个数。

分析:简单题、并查集。

注意:数据读入方式出错会出现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;}

原创粉丝点击