Browse Source

Adaugare problema "asmax" si "dfs" pentru infoarena

master
Matei-Alexandru Gardus 10 months ago
parent
commit
cd849cee83
Signed by: StormFireFox1 <matei@gardus.eu> GPG Key ID: F3D2B830AB9B94AA

+ 2
- 0
infoarena/CMakeLists.txt View File

@@ -3,8 +3,10 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.2.0)
project("infoarena")

add_subdirectory("atac")
add_subdirectory("asmax")
add_subdirectory("bemo")
add_subdirectory("cautbin")
add_subdirectory("dfs")
add_subdirectory("heapuri")
add_subdirectory("jap2")
add_subdirectory("mexitate")

+ 7
- 0
infoarena/asmax/CMakeLists.txt View File

@@ -0,0 +1,7 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.2.0)

get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId})

add_executable(${PROJECT_NAME} main.cpp)

+ 46
- 0
infoarena/asmax/main.cpp View File

@@ -0,0 +1,46 @@
#include <fstream>
#include <vector>
#define INFINITY 1000000000
#define NMAX 16000

using namespace std;

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

int n, // numarul de noduri
sol = -INFINITY, // suma maxima finala, trebuie numar mic pentru maxim
val[NMAX + 1], // valorile fiecarui nod. valoare[x] = valoarea nodului x
suma[NMAX + 1], // suma[x] = suma pentru DFS din nod x
vizitat[NMAX + 1]; // vectorul de vizitare.
vector<int> vecini[NMAX + 1]; // vectorul de vecini. vecini[x] = vecinii nodului x

void dfs(int nod) {
vizitat[nod] = 1;
for (auto vecin : vecini[nod]) {
if (!vizitat[vecin]) {
dfs(vecin);
suma[nod] += max(suma[vecin], 0);
}
}
suma[nod] += val[nod];
}

int main() {
int x, y;
fin >> n;
for (int i = 1; i <= n; i++) {
fin >> val[i];
}
for (int i = 1; i <= n - 1; i++) {
fin >> x >> y;
vecini[x].push_back(y);
vecini[y].push_back(x);
}
dfs(1);
for (int i = 1; i <= n; i++) {
sol = max(sol, suma[i]);
}
fout << sol;
return 0;
}

+ 7
- 0
infoarena/dfs/CMakeLists.txt View File

@@ -0,0 +1,7 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.2.0)

get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId})

add_executable(${PROJECT_NAME} main.cpp)

+ 47
- 0
infoarena/dfs/main.cpp View File

@@ -0,0 +1,47 @@
#include <fstream>
#include <vector>

using namespace std;

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

/* DFS
*
* Aceasta este parcurgerea DFS simpla. Problema in sine numără numărul de componente conexe.
*
* Găsiți detalii pe Wikipedia și TopCoder. https://www.topcoder.com/community/competitive-programming/tutorials/introduction-to-graphs-and-their-data-structures-section-2/
*/

int n, // numărul de noduri
m, // numărul de muchii
nrComponente = 0, // numărul de componente conexe
vizitat[100001]; // vectorul de vizitare (vizitat[x] = numarul componentei conexe din care face parte)
vector<int> vecini[100001]; // vectorul de vecini. vecini[x] = vecinii nodului x

void dfs(int nod) {
vizitat[nod] = nrComponente;
for(int i = 0; i < vecini[nod].size(); i++) {
if(vizitat[vecini[nod][i]] == 0) {
dfs(vecini[nod][i]);
}
}
}

int main() {
int x, y;
fin >> n >> m;
for(int i = 1; i <= m; i++) {
fin >> x >> y;
vecini[x].push_back(y);
vecini[y].push_back(x);
}
for(int i = 1; i <= n; i++) {
if (vizitat[i] == 0 ) {
nrComponente++;
dfs(i);
}
}
fout << nrComponente;
return 0;
}

Loading…
Cancel
Save