Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions algorithms/lab06/check
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: BSD-3-Clause

NUM_TASKS=4
TASKS=(task-1 task-2 task-3 task-4)
NUM_TESTS=(10 10 0 0)
NUM_TASKS=3
TASKS=(01-bfs 02-dfs 03-topsort)
NUM_TESTS=(10 10 10)

TIMEOUT_CPP=1
TIMEOUT_JAVA=1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,6 @@ class Task {
}

vector<int> get_result() {
// TODO: Faceti un BFS care sa construiasca in d valorile cerute:
// * d[node] = numarul minim de muchii de parcurs de la nodul `source` la nodul `node`
// * d[source] = 0
// * d[node] = -1, daca nu exista drum de la source la node
// *******
// ATENTIE: nodurile sunt indexate de la 1 la n.
// *******

return bfs(source);
}

Expand Down
89 changes: 89 additions & 0 deletions algorithms/lab06/cpp/02-dfs/02-dfs.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// SPDX-License-Identifier: BSD-3-Clause

#include <fstream>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class Task {
public:
void solve() {
read_input();
write_output(get_result());
}

private:
// numarul maxim de noduri
static constexpr int NMAX = (int)1e5 + 5; // 10^5 + 5 = 100.005

// n = numar de noduri, m = numar de muchii/arce
int n, m;

// adj[node] = lista de adiacenta a nodului node
// exemplu: daca adj[node] = {..., neigh, ...} => exista muchia (node, neigh)
vector<int> adj[NMAX];

void read_input() {
ifstream fin("in");
fin >> n >> m;
for (int i = 1, x, y; i <= m; i++) {
// muchie (x, y)
fin >> x >> y;
adj[x].push_back(y);
adj[y].push_back(x);
}
fin.close();
}

int get_result() {
return solve_dfs();
}

// Complexitate: O(n + m)
int solve_dfs() {
int connected_components = 0;
vector<int> visited(n + 1, 0);

// pentru fiecare nod
for (int node = 1; node <= n; node++) {
// daca nodul este nevizitat, pornim o parcurgere
if (visited[node] == 0) {
connected_components++;
dfs(node, visited);
}
}

return connected_components;
}

// porneste o parcurgere DFS din node
// foloseste vectorul visited pentru a marca nodurile vizitate
void dfs(int node, vector<int>& visited) {
visited[node] = 1; // marchez nodul ca fiind vizitat

// parcurg vecinii
for (auto& neigh : adj[node]) {
if (visited[neigh] == 0) {
dfs(neigh, visited);
}
}
}

void write_output(int result) {
ofstream fout("out");
fout << result << '\n';
fout.close();
}
};

// [ATENTIE] NU modifica functia main!
int main() {
std::unique_ptr<Task> task {new (nothrow) Task()};
if (!task) {
std::cerr << "new failed: WTF are you doing? Throw your PC!\n";
return -1;
}
task->solve();
return 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,6 @@ class Task {
}

vector<int> get_result() {
// TODO: Faceti sortarea topologica a grafului stocat cu liste de adiacenta din adj.
// *******
// ATENTIE: nodurile sunt indexate de la 1 la n.
// *******

return solve_bfs();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,6 @@ class Task {
}

vector<int> get_result() {
// TODO: Faceti sortarea topologica a grafului stocat cu liste de adiacenta din adj.
// *******
// ATENTIE: nodurile sunt indexate de la 1 la n.
// *******

return solve_dfs();
}

Expand Down
122 changes: 0 additions & 122 deletions algorithms/lab06/cpp/task-3/sol1_dfs.cpp

This file was deleted.

117 changes: 0 additions & 117 deletions algorithms/lab06/cpp/task-4/sol1_bfs.cpp

This file was deleted.

Loading
Loading