栈,AOE,天啊,题目居然骗我,他说最多入度为100个,去死,都不是这样的,叉。 害得我用数组存东西,好吧,我后来觉悟了,我用list!结果AC #include <cstdio> #include <cstdlib> #include <list> #include <cstring> using namespace std; const int MAX = 10010; list<int> out[MAX]; int insize[MAX]; int value[MAX]; int weight[MAX]; int stack[MAX]; int n,stacki; int find() { int top,mid,max; stacki = 0 ; max = -1; for( int i = 1 ; i <= n ; ++i ) { weight[ i ] = value[i]; if( insize[i] == 0 ) stack[ stacki ++ ] = i ; } while( stacki != 0 ) { top = stack[ stacki - 1 ]; if( weight[ top ] > max ) max = weight[ top ]; stacki--; list<int>::iterator i; for( i = out[top].begin() ; i != out[top].end() ; ++i ) { mid = *i; if( weight[ mid ] < weight[ top ] + value[ mid ] ) weight[ mid ] = weight[ top ] + value[ mid ]; insize[ mid ] --; if( insize[ mid ] == 0 ) stack[ stacki ++ ] = mid; } } return max; } int main() { int mid; scanf("%d",&n); for( int i = 1 ; i <= n ; ++i ) { scanf("%d%d",&value[i],&insize[i]); for( int j = 0 ; j != insize[i] ; ++j ) { scanf("%d",&mid); out[ mid ].push_back( i ); } } printf("%d/n",find()); return 0; } 此题有更加简洁的做法。334MS 因为从1到N本来就是拓扑排序了,所以,你懂的。-_-! #include <cstdio> #include <cstdlib> #include <list> #include <cstring> using namespace std; const int MAX = 10010; int weight[ MAX ]; int n,stacki; int main() { int mid,max,value,single; max = -1; scanf("%d",&n); for( int i = 1 ; i <= n ; ++i ) { scanf("%d%d",&value,&mid); weight[i] = value; for( int j = 0 ; j != mid ; ++j ) { scanf("%d",&single); if( weight[i] < weight[single] + value ) weight[i] = weight[single] + value; } if( weight[i] > max ) max = weight[i]; } printf("%d/n",max); return 0; }