Pagini recente » Cod sursa (job #1775217) | Cod sursa (job #1486643) | Cod sursa (job #2587095) | Cod sursa (job #309918) | Cod sursa (job #2470979)
#include <bits/stdc++.h>
using namespace std;
long long t, n,m, adj[15010], a[15010], A, B, ans = -1e9, k, val[15010];
bool viz[15010];
queue<int> q;
vector<int> v[15010];
//vector<int>::iterator it;
void sort_top(int x){
viz[x]=1;
for(int i = 0; i < v[x].size();i++){
if(!viz[v[x][i]])
sort_top(v[x][i]);
}
q.push(x);
}
void curatare(){
for(int i=1;i<=n;i++){
viz[i] = 0;
val[i] = 0;
}
ans = -1e9;
k=0;
for(int i=1;i<=n;i++)
v[i].clear();
}
int main(){
ifstream cin("easygraph.in");
ofstream cout("easygraph.out");
cin>>t;
while(t--){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
ans = max(ans, a[i]);
val[i] = a[i];
}
for(int i=0;i<m;i++){
cin>>A>>B;
v[A].push_back(B);
}
for(int i=1;i<=n;i++){
if(!viz[i]) sort_top(i);
}
while(!q.empty()){
adj[k++] = q.front();
// cout<<adj[k-1]<<' ';
q.pop();
}
//cout<<'\n';
for(int i=1;i<=n;i++)
val[i] = a[i];
for(int i=k-1;i>=0;i--){
ans = max(ans, val[adj[i]]);
if(val[adj[i]]<0) val[adj[i]] = 0;
//cout<<val[adj[i]]<<": ";
for(int j = 0; j < v[adj[i]].size(); j++){
val[v[adj[i]][j]] = max(val[v[adj[i]][j]],val[adj[i]] + a[v[adj[i]][j]]);
// cout<<val[v[adj[i]][j]]<<' ';
}
//cout<<'\n';
}
cout<<ans<<'\n';
curatare();
}
return 0;
}