Submission #1160502

#TimeUsernameProblemLanguageResultExecution timeMemory
1160502jus_tengVillage (BOI20_village)C++20
12 / 100
49 ms840 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

vector<vector<ll>> computeDistances(ll numberOfHouses, vector<vector<ll>>& adjacencyList){
    
    vector<vector<ll>> distances(numberOfHouses + 1, vector<ll>(numberOfHouses + 1, 0));
    
    for (ll startHouse = 1; startHouse <= numberOfHouses; startHouse++){
        
        vector<ll> distanceFromStart(numberOfHouses + 1, -1);
        queue<ll> housesToVisit;
        distanceFromStart[startHouse] = 0;
        housesToVisit.push(startHouse);
        
        while (!housesToVisit.empty()){
            
            ll currentHouse = housesToVisit.front();
            housesToVisit.pop();
            
            for (ll nextHouse : adjacencyList[currentHouse]){
                
                if (distanceFromStart[nextHouse] == -1){
                    
                    distanceFromStart[nextHouse] = distanceFromStart[currentHouse] + 1;
                    housesToVisit.push(nextHouse);
                }
            }
        }
        
        for (ll endHouse = 1; endHouse <= numberOfHouses; endHouse++){
            
            distances[startHouse][endHouse] = distanceFromStart[endHouse];
        }
    }
    
    return distances;
}

void solve(){
    
    ll numberOfHouses;
    scanf("%lld", &numberOfHouses);
    
    vector<vector<ll>> adjacencyList(numberOfHouses + 1);
    
    for (ll i = 0; i < numberOfHouses - 1; i++){
        
        ll houseA, houseB;
        scanf("%lld %lld", &houseA, &houseB);
        adjacencyList[houseA].push_back(houseB);
        adjacencyList[houseB].push_back(houseA);
    }
    
    vector<vector<ll>> distances = computeDistances(numberOfHouses, adjacencyList);
    
    if (numberOfHouses > 10){
        
        vector<ll> simpleAssignment(numberOfHouses + 1);
        
        for (ll i = 1; i <= numberOfHouses; i++){
            
            simpleAssignment[i] = (i % numberOfHouses) + 1;
        }
        
        ll totalDistance = 0;
        
        for (ll i = 1; i <= numberOfHouses; i++){
            
            totalDistance += distances[i][simpleAssignment[i]];
        }
        
        printf("%lld %lld\n", totalDistance, totalDistance);
        
        for (ll i = 1; i <= numberOfHouses; i++){
            
            printf("%lld", simpleAssignment[i]);
            
            if (i < numberOfHouses){
                
                printf(" ");
            }
            
        }
        
        printf("\n");
        
        for (ll i = 1; i <= numberOfHouses; i++){
            
            printf("%lld", simpleAssignment[i]);
            
            if (i < numberOfHouses){
                
                printf(" ");
            }
        }
        
        printf("\n");
        return;
    }
    
    vector<ll> permutation(numberOfHouses);
    
    for (ll i = 0; i < numberOfHouses; i++){
        
        permutation[i] = i + 1;
    }
    
    ll minTotalDistance = LLONG_MAX;
    ll maxTotalDistance = LLONG_MIN;
    vector<ll> minAssignment(numberOfHouses);
    vector<ll> maxAssignment(numberOfHouses);
    
    do{
        
        bool isValidMove = true;
        
        for (ll i = 0; i < numberOfHouses; i++){
            
            if (permutation[i] == i + 1){
                
                isValidMove = false;
                break;
            }
        }
        
        if (isValidMove){
            
            ll currentTotal = 0;
            
            for (ll i = 0; i < numberOfHouses; i++){
                
                currentTotal += distances[i + 1][permutation[i]];
            }
            
            if (currentTotal < minTotalDistance){
                
                minTotalDistance = currentTotal;
                minAssignment = permutation;
            }
            
            if (currentTotal > maxTotalDistance){
                
                maxTotalDistance = currentTotal;
                maxAssignment = permutation;
            }
        }
        
    } while (next_permutation(permutation.begin(), permutation.end()));
    
    printf("%lld %lld\n", minTotalDistance, maxTotalDistance);
    
    for (ll i = 0; i < numberOfHouses; i++){
        
        printf("%lld", minAssignment[i]);
        
        if (i < numberOfHouses - 1){
            
            printf(" ");
        }
    }
    
    printf("\n");
    for (ll i = 0; i < numberOfHouses; i++){
        
        printf("%lld", maxAssignment[i]);
        
        if (i < numberOfHouses - 1){
            
            printf(" ");
        }
    }
    
    printf("\n");
}

int main(){
    solve();
    return 0;
}

Compilation message (stderr)

Village.cpp: In function 'void solve()':
Village.cpp:44:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   44 |     scanf("%lld", &numberOfHouses);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Village.cpp:51:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   51 |         scanf("%lld %lld", &houseA, &houseB);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...