题目与提交:http://www.rqnoj.cn/Problem_480.html 这题用并查集做,还是很简单的。 #include <iostream> using namespace std; int _gf[501],_gn; //并查集 int _fGetFather( int n ) { if( _gf[n] != n ) _gf[n] = _fGetFather( _gf[n] ); return _gf[n]; } int main() { //初始化 bool visit[501]; scanf("%d",&_gn); for( int i = 0;i <= _gn;++i ) { _gf[i] = i; visit[i] = false; } int tin,fa,fb,count = _gn; for( int i = 1;i <= _gn;++i ) { for( int j = 1;j <= _gn;++j ) { scanf("%d",&tin); if( tin ) { fa = _fGetFather( i ); fb = _fGetFather( j ); if( fa != fb ) //合并 { --count; _gf[fb] = fa; } } } } //end------ cout << count << endl; for( int i = 1;i <= _gn;++i ) { if( !visit[i] ) { visit[i] = true; fa = _fGetFather(i); cout << i << ' '; for( int j = i+1;j <= _gn;++j ) { if( _fGetFather(j) == fa ) { cout << j << ' '; visit[j] = true; } } cout << endl; } } return 0; }