Cod sursa(job #2828488)

Utilizator truscalucaLuca Trusca truscaluca Data 7 ianuarie 2022 14:28:12
Problema Asmax Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

const int nMax = 100005;

vector<int> listaAd[nMax];
int pret[nMax], orase[nMax], n, m;

void dfs(int x) {
    for (auto y: listaAd[x]) {
        if (pret[x] < pret[y]) {
            pret[y] = pret[x];
            dfs(y);
        }
    }
}

bool compara(int x, int y) {
    return pret[x] < pret[y];
}

int main() {
    // Daca pentru fiecare nod fac DFS si caut pretul minim de achizitie => 85p O(n^2)
    // Solutia de 100p este sa transformam problema din una de achizitie intr-una de
    // distributie.
    // Astfel, sortam orasele crescator, dupa costul lor, si incepem sa distribuim din
    // orasul cu cel mai mic cost (folosind tot o parcurgere DFS). Totusi, daca in DFS,
    // la pasul curent, gasim un cost mai mic decat cel curent, ne oprim (pentru ca inseamna
    // ca a fost actualizat la un pas anterior) => complexitate O(n) pe DFS, sortare O(n logn)
    // => O(n logn)


    // Input rapid
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    ifstream in("srevni.in");
    ofstream out("srevni.out");

    // Input
    in >> n >> m;
    for (int i = 1; i <= n; i++) {
        in >> pret[i];
    }
    for (int i = 1; i <= m; i++) {
        int x, y;
        in >> x >> y;

        // Graf orientat transpus
        listaAd[y].push_back(x);
        orase[i] = i;
    }

    // Sortam indicii oraselor dupa costul acestora
    sort(orase + 1, orase + n + 1, compara);
    for (int i = 1; i <= n; i++) {
        dfs(orase[i]);
    }

    for (int i = 1; i <= n; i++) {
        out << pret[i] << " ";
    }

    return 0;
}