Submission #1160509

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

typedef long long ll;

/*BFS algorithm adapted from https://cp-algorithms.com/graph/breadth-first-search.html
Modifications:
- `vector<bool> visited` to track visited nodes
- Initialized `vector<ll> distanceFromStart(numberOfHouses + 1, 0)` to 0 and not -1
- Initialized `queue<ll> q` with start node and marked as visited
- `distanceFromStart[v] = distanceFromStart[u] + 1` to update distances
*/

vector<vector<ll>> BFSAlgo(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, 0);
        vector<bool> visited(numberOfHouses + 1, false);
        queue<ll> q;

        q.push(startHouse);
        visited[startHouse] = true;

        while (!q.empty()){
            
            ll currentHouse = q.front();
            q.pop();

            for (ll nextHouse : adjacencyList[currentHouse]){
                
                if (!visited[nextHouse]){
                    
                    visited[nextHouse] = true;
                    q.push(nextHouse);
                    distanceFromStart[nextHouse] = distanceFromStart[currentHouse] + 1;
                }
            }
        }

        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 = BFSAlgo(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:55:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   55 |     scanf("%lld", &numberOfHouses);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Village.cpp:62:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |         scanf("%lld %lld", &houseA, &houseB);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...