Pagini recente » Cod sursa (job #2696372) | Cod sursa (job #1704519) | Cod sursa (job #534052) | Cod sursa (job #392997) | Cod sursa (job #2830363)
// 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);
}