USACO Agri-Net

View Code
bool connectedMap[100];

int findMin(int map[100][100], int farm_num, int& posi, int& posj, bool bFirstTime)
{
    
int min = 9999999;
    
int mini=-1, minj=-1;
    
for(int i=0; i<farm_num; i++)
        
for(int j=0; j<i; j++)
        {
            
if(false == bFirstTime &&
                    (
                    (connectedMap[i] 
&& connectedMap[j])
                    
|| (!connectedMap[i] && !connectedMap[j])
                    )
                )
                
continue;
            
if( map[i][j] < min )
            {
                min 
= map[i][j];
                mini
= i; minj = j;
            }
        }
    posi 
= mini;
    posj 
= minj;
    
return min;
}

bool IsAllConnected(int farm_num)
{
    
for(int i=0; i<farm_num; i++)
        
if(connectedMap[i] == false)
            
return false;
    
return true;
}

int main()
{
    
int distMap[100][100];
    
    
int farm_num; 
    cin 
>> farm_num;

    
for(int i=0; i<farm_num; i++)
        
for(int j=0; j<farm_num; j++)
        {
            
int dist; cin >> dist;
            distMap[i][j] 
= dist;
        }

    
    
for(int i=0; i<farm_num; i++)
        connectedMap[i] 
= false;
    
int sum = 0;
    
bool bFirstTime = true;
    
while(false == IsAllConnected(farm_num))
    {
        
int i, j;
        
int min = findMin(distMap, farm_num, i, j, bFirstTime);
        bFirstTime 
= false;
        sum 
+= min;
        connectedMap[i] 
= true;
        connectedMap[j] 
= true;
    }

    cout 
<< sum << endl;
    
return 0;
}

posted on 2011-07-19 17:25  kainster  阅读(129)  评论(0)    收藏  举报

导航