最小树形图
xnozero吧
全部回复
仅看楼主
level 12
XNoZero 楼主
int INF=1<<30;
int father[110];
int map[110][110], ans;
bool visite[110], circle[110];
int root;
int exist_circle()
{
     father[root]= root;
     for( int i= 1; i<= n; ++i )
     if( !circle[i] && i!= root )
     {
         father[i]= i; map[i][i]= INF;
         for( int j= 1; j<= n; ++j )
         if( !circle[j] && map[j][i]< map[father[i]][i] )
         father[i]= j;
     }
     int i;
     for( i= 1; i<= n; ++i )
     {
         if( circle[i] ) continue;
         memset( visite, false, sizeof(visite) );
         int j= i;
         while( !visite[j] ) {   visite[j]= true;   j= father[j];   }
         if( j== root ) continue;
         return j;
     }
     return -1;
}
void   update( int t )
{
     ans+= map[father[t]][t];
     for( int i= father[t]; i!= t; i= father[i] )
     {
         ans+= map[father[i]][i];
         circle[i]= true;
     }
     for( int i= 1; i<= n; ++i )
     if( !circle[i] && map[i][t]!= INF )
     map[i][t]-= map[father[t]][t];
     for( int j= father[t]; j!= t; j= father[j] )
         for( int i= 1; i<= n; ++i )
         {
             if( circle[i] ) continue;
             if( map[i][j]!= INF )
             map[i][t]= min( map[i][t], map[i][j]- map[father[j]][j] );
             map[t][i]= min( map[j][i], map[t][i] );
         }
}
void solve()
{
     memset( circle, false, sizeof(circle) );
     int j;
     while( ( j= exist_circle() )!= -1 ) update( j );
     for( j= 1; j<= n; ++j )
     if( j!= root && !circle[j] )
     ans+= map[father[j]][j];
}
2010年11月24日 07点11分 1
1