Pagini recente » Cod sursa (job #795966) | Cod sursa (job #1811484) | Cod sursa (job #1346045) | Cod sursa (job #423924) | Cod sursa (job #2828488)
#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;
}