和上题一样的,只是用桶用来,问题是,怎么快不了多少。。。? #include<cstdio> #include<vector> using namespace std; typedef struct _Node { int x; int y; int path; }Node; const int MAX = 130; const int MAXLIST = 1000; int A[MAX][MAX]; bool Exist[MAX][MAX]; vector<Node> Min[MAXLIST]; bool operator<( const Node & a , const Node & b ) { return a.path > b.path; } void GetNext( int beginX , int beginY , int n , int & maxpath ) { static const int x[4] = {0,0,1,-1}; static const int y[4] = {1,-1,0,0}; Node New; for( int i = 0 ; i != 4 ; ++i ) { New.x = beginX + x[i]; New.y = beginY + y[i]; if( !Exist[ New.x ][ New.y ] ) { New.path = A[ beginX ][ beginY ] + A[New.x][New.y]; Min[ New.path ].push_back( New ); } } } void Find( int n ) { for( int i = 1 ; i != n ; ++i ) for( int j = 1 ; j != n ; ++j ) Exist[ i ][ j ] = false; Node mid; int i = 0 , maxpath = 0 ; mid.x = mid.y = 1 ;mid.path = A[1][1]; Min[ mid.path ].push_back( mid ); while( 1 ) { while( Min[i].empty() )++i; mid = *Min[i].rbegin(); Min[i].pop_back(); if( Exist[mid.x][mid.y] )continue; Exist[ mid.x ][ mid.y ] = true; A[ mid.x ][ mid.y ] = mid.path ; if( mid.x == n - 1 && mid.y == n - 1 ) break ; GetNext( mid.x , mid.y , n ,maxpath ); } } int main() { int n ,m = 0 ; while( scanf("%d",&n) , n != 0 ) { ++n; for( int i = 0 ; i != MAXLIST ; ++i ) Min[i].clear(); for( int i = 1 ; i != n ; ++i ) { Exist[0][i] = Exist[i][0] = true; Exist[n][i] = Exist[i][n] = true; } for( int i = 1 ; i != n ; ++i ) for( int j = 1 ; j != n ; ++j ) scanf("%d",&A[i][j]); Find( n ); printf("Problem %d: %d/n", ++m , A[ n - 1 ][ n - 1 ]); } return 0; }