Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:how to solve it?In Reply To:how to solve it? Posted by:anne2277 at 2005-07-06 21:32:11 使用邻接表也不行呀。 #include<iostream> #include<stdio.h> using namespace std; int n; int visit[1502]; struct type { int num; int q[2202]; }a[1502]; void greedy() { memset( visit, 0, sizeof(visit) ); int cnt = 0; while( 1 ) { int max = 0; int index; for( int i = 0; i < n; i++ ) { if( visit[i] == 1 )continue; if( a[i].num <= max )continue; int sum = 1; //寻找最大连接的点 for( int j = 0; j < a[i].num; j++ ) { if( visit[j] == 0 ) { sum++; } } if( sum > max ) { max = sum; index = i; } } if( max == 0 )break; //更新,调整过程 cnt++; visit[index] = 1; for( int i = 0; i < a[index].num; i++ ) { visit[a[index].q[i]] = 1; } } printf( "%d\n", cnt ); } /* void output() { for( int i = 0; i < n; i++ ) { cout << i << ": "; for( int j = 0; j < a[i].num; j++ ) { cout << a[i].q[j] << " "; } cout << endl; } cout << endl; } */ int main() { while( scanf( "%d", &n ) != EOF ) { int v; memset( a, 0, sizeof(a) ); for( int i = 0; i < n; i++ ) { scanf( "%d", &v ); getchar(); getchar(); int num; scanf( "%d", &num ); getchar(); int tmp; for( int j = a[v].num; j < a[v].num+num; j++ ) { scanf( "%d", &tmp ); a[v].q[j] = tmp; a[tmp].q[a[tmp].num++] = v; } a[v].num += num; } //output(); greedy(); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator