Cod sursa(job #2932627)

Utilizator EduardSanduSandu Eduard Alexandru EduardSandu Data 3 noiembrie 2022 13:21:10
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
using namespace std;

vector<vector<long long>> v;
vector<long long> visited, departureNodes, cost;

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

long long n,m,maxi;

void dfs(int nod)
{
    visited[nod] = 1;
    long long currentMax = 0;
    for(int i=0; i<v[nod].size(); i++)
    {
        if(visited[v[nod][i]] == 0)
            dfs(v[nod][i]);

        currentMax = max(currentMax, cost[v[nod][i]]);
    }
    cost[nod] += currentMax;
    maxi = max(maxi, cost[nod]);
}

int main()
{
    int t,a,b;
    fin>>t;
    for(int test = 1; test <= t; test++)
    {
        fin>>n>>m;
        visited.clear();
        visited.resize(n+2);
        departureNodes.clear();
        departureNodes.resize(n+2);
        v.clear();
        v.resize(n+2);
        cost.clear();
        cost.resize(n+2);
        for(int i=1; i<=n; i++)
        {
            fin>>cost[i];
        }
        for(int i=1; i<=m; i++)
        {
            fin>>a>>b;
            v[a].push_back(b);
            departureNodes[b] = 1; //1 - intra ceva in nod deci exista un nod superior din care sa plecam sa ajugem si aici
        }
        maxi = LLONG_MIN;
        for(int i=1; i<=n; i++)
            if(departureNodes[i] == 0)
                dfs(i);
        fout<<maxi<<'\n';

    }
    return 0;
}