Cod sursa(job #3276090)

Utilizator ShAwDoRneYNacu Gabriel ShAwDoRneY Data 12 februarie 2025 17:56:41
Problema Sate Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <vector>
#include <unordered_set>
#include <queue>

using namespace std;

ifstream fin("easygraph.in");
ofstream fout("easygraph.out");

int main() {

    int q;
    fin >> q;

    while(q--) {

        int noNodes, noEdges;
        fin >> noNodes >> noEdges;
        vector<unordered_set<int>> graph(noNodes+1, unordered_set<int>());
        vector<int> cost(noNodes+1);
        vector<int> inDeg(noNodes+1, 0);

        for(int i=1; i<=noNodes; i++)
            fin >> cost[i];
        
        for(int i=1; i<=noEdges; i++) {
            int x,y;
            fin >> x >> y;
            graph[x].insert(y);
            inDeg[y] = 1;
        }

        queue<int> Q;
        vector<bool> isVisited(noNodes+1, false);
        vector<int> dp(noNodes+1, 0);

        for(int i=1; i<=noNodes; i++) {
            if(inDeg[i] == 0) {
                Q.push(i);
                isVisited[i] = true;
            }
            dp[i] = cost[i];
        }

        int maxDist = -1e9;

        while(!Q.empty()) {

            int nod = Q.front();
            Q.pop();
            
            maxDist = max(maxDist, dp[nod]);

            for(auto neighbor : graph[nod]) {
                if(dp[nod] + cost[neighbor] > dp[neighbor]) {
                    dp[neighbor] = dp[nod] + cost[neighbor];
                }
                if(!isVisited[neighbor]) {
                    isVisited[neighbor] = true;
                    Q.push(neighbor);
                }
            }
        }
        
        fout << maxDist << '\n';
    }
    

    return 0;
}