Pagini recente » Cod sursa (job #2932700) | Cod sursa (job #3293588) | Cod sursa (job #3140467) | Rating Tragla Matei (piertoi) | Cod sursa (job #3276090)
#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;
}