http://acm.hust.edu.cn/vjudge/contest/view.action?cid=34121#problem/F
// File Name: f.cpp // Author: bo_jwolf // Created Time: 2013年10月16日 星期三 16:54:03 #include<vector> #include<list> #include<map> #include<set> #include<deque> #include<stack> #include<bitset> #include<algorithm> #include<functional> #include<numeric> #include<utility> #include<sstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<ctime> using namespace std; const int maxn = 1000005; int fa[ maxn ]; struct node{ int x, y; }edge[ maxn ]; void Union(){ for( int i = 0; i < maxn; ++i ){ fa[ i ] = i; } } int cmp( const node a, const node b ){ if( a.x != b.x ) return a.x < b.x; return a.y < b.y; } int find( int x ){ return fa[ x ] = ( x == fa[ x ] ? x : find( fa[ x ] ) ); } int main(){ int n, m, a, b, temp = 1; while( scanf( "%d%d", &n, &m ) != EOF ){ Union(); if( !n && !m ) break; int k = 0; while( m-- ){ scanf( "%d%d", &a, &b ); edge[ k ].x = a; edge[ k++ ].y = b; } sort( edge, edge + k , cmp); int ans = n; for( int i = 0; i < k; ++i ){ int x = find( edge[ i ].x ); int y = find( edge[ i ].y ); if( x != y ){ fa[ x ] = y; ans--; } } printf( "Case %d: %d\n", temp++, ans ); } return 0; }