Cod sursa(job #2830363)

Utilizator carmenacatrineiCarmen-Lorena Acatrinei carmenacatrinei Data 9 ianuarie 2022 19:54:20
Problema Asmax Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.63 kb
// Graph.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <algorithm>
#include <time.h>
#include <stdlib.h>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <fstream>
#include <limits.h>
#include <string.h>


using namespace std;
fstream in_file;
fstream out_file;

class Graph
{
public:
	Graph(int V)
	{
		this->V = V;
		//Facem sa avem doar V noduri de adiacenta
		for (int i = 0; i < V; i++)
		{
			vector<int> vector;
			adiacenta.push_back(vector);
		}
	}
	~Graph() {}

	//Adaug muchia intre nodul deLa si nodul panaLa, dar si invers pentru un graf neorientat
	void addEdge2(int deLa, int panaLa)
	{
		adiacenta[deLa].push_back(panaLa);
		adiacenta[panaLa].push_back(deLa);
	}

	//Incepem DFS din nodul de plecare
	void DFScuSubgrafuri(int nodPlecare, vector<int> &valoare_nod)
	{
		// Creez vectorul de noduri vizitate
		vector<bool> vizitat;
		for (int i = 0; i < this->V; i++)
		{
			vizitat.push_back(false);
		}

		//Mergem recursiv prin toate nodurile ce pleaca de la nodul nodPlecare cu ajutorul functiei DFSUtil

		DFSUtil(nodPlecare, vizitat, valoare_nod);

		//Caut posibilul subgraf cu cea mai mare valoare si il afisez

		int maxim = INT_MIN;
		for (int i = 0; i < this->V; i++)
		{
			if (valoare_nod[i] > maxim)
				maxim = valoare_nod[i];
		}

		out_file << maxim;
	}

private:
	int V;	//nr de noduri
	vector<vector<int>> adiacenta;

	//Functie utilitara pentru parcurgerea dfs
	void DFSUtil(int nodPlecare, vector<bool>& vizitat, vector<int> &valoare_din_nod)
	{
		vizitat[nodPlecare] = true;

		for (int i = 0; i < adiacenta[nodPlecare].size(); i++)
		{
			int nodCurent = adiacenta[nodPlecare][i];
			//Daca nodul curent nu a fost vizitat, incepem dfs ul in el
			//La intoarcere, daca valoarea subgrafului pana in "nodul curent" > 0, atunci adaugam valoarea din nodul de plecare in subgraf
			if (!vizitat[nodCurent])
			{
				DFSUtil(nodCurent, vizitat, valoare_din_nod);
				if (valoare_din_nod[nodCurent] > 0)
					valoare_din_nod[nodPlecare] += valoare_din_nod[nodCurent];
			}
		}
	}

};


int main()
{
	in_file.open("asmax.in");
	out_file.open("asmax.out", ios::out);

	int nr_noduri;

	in_file >> nr_noduri;
	Graph graf(nr_noduri);

	int nod1, nod2, valoare;

	vector<int> valoare_nod;

	for (int i = 0; i < nr_noduri; i++)
	{
		in_file >> valoare;
		valoare_nod.push_back(valoare);
	}

	for (int i = 0; i < nr_noduri; i++)
	{
		in_file >> nod1 >> nod2;
		graf.addEdge2(nod1 - 1, nod2 - 1);
	}

	graf.DFScuSubgrafuri(0, valoare_nod);
}