diff options
author | Santo Cariotti <dcariotti24@gmail.com> | 2020-06-24 18:15:19 +0200 |
---|---|---|
committer | Santo Cariotti <dcariotti24@gmail.com> | 2020-06-24 18:15:19 +0200 |
commit | b7f94d1a14bbebb76c110d3047a6e38dd410a4b5 (patch) | |
tree | 5237e73dba39d756b2c3529c374117bb42f88a3c /I_anno/Programmazione_2/exercises/matrice-adj.cc | |
parent | f9db5ea3d85862050fa3cb921baacab4cf1529dd (diff) |
chore: add exercise
Diffstat (limited to 'I_anno/Programmazione_2/exercises/matrice-adj.cc')
-rw-r--r-- | I_anno/Programmazione_2/exercises/matrice-adj.cc | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/I_anno/Programmazione_2/exercises/matrice-adj.cc b/I_anno/Programmazione_2/exercises/matrice-adj.cc new file mode 100644 index 0000000..7830f97 --- /dev/null +++ b/I_anno/Programmazione_2/exercises/matrice-adj.cc @@ -0,0 +1,151 @@ +#include<iostream> +#include<vector> +#include<fstream> +#include<sstream> + +using namespace std; + +template<class H> +class matrix_graph { +public: + ~matrix_graph() { + delete[] _m; + delete[] _k; + } + matrix_graph(int len) : _len{len}, _nodes{0}, _edges{0} { + _m = new int*[len]; + _k = new H*[len]; + for(int i = 0; i < len; ++i) { + _m[i] = new int[len]; + _k[i] = nullptr; + for(int j = 0; j < len; ++j) + _m[i][j] = 0; + } + } + + matrix_graph<H>* add_node(H k) { + if(_len == _nodes) return this; // no more space for new nodes + if(_index(k) > -1) return this; // nodes already exists + + _k[_nodes++] = new H(k); + + return this; + } + + matrix_graph<H>* add_edge(H x, H y) { + int i = _index(x); + int j = _index(y); + if(i < 0 || j < 0) return this; + if(!_m[i][j]) { + _m[i][j] = 1; + _edges++; + } + return this; + } + vector<vector<H>> print() { + vector<vector<H>> v; + for(int i = 0; i < _len; ++i) { + v.push_back(vector<H>{*_k[i]}); + vector<H> temp; + for(int j = 0; j < _len; ++j) { + if(_m[i][j]) { + temp.push_back(*_k[j]); + } + } + sort(begin(temp), end(temp)); + for(auto const& j : temp) + v[i].push_back(j); + } + + sort(begin(v), end(v)); + return v; + } +private: + int _len, _nodes, _edges; + int** _m; + H** _k; + int _index(H x) { + for(int i = 0; i < _nodes; ++i) + if(*_k[i] == x) return i; + return -1; + } +}; + +template<class H> +string result(vector<vector<H>> v) { + string s{""}; + ostringstream ss; + for(auto const& i : v) { + s += "("; + for(auto const& j : i) { + ss << j; + s+= ss.str(); + s+= ' '; + ss.str(""); ss.clear(); + } + s.pop_back(); + s += ") "; + } + return s; +} + +int main() { + ifstream in("input.txt"); + ofstream out("output.txt"); + for(int ts = 0; ts < 100; ++ts) { + int n, m; + in >> n >> m; + string t; + in >> t; + if(t == "int") { + matrix_graph<int>* g = new matrix_graph<int>(n); + int x,y; + for(int i = 0; i < n; ++i) { + in >> x; + g->add_node(x); + } + char ex; + for(int i = 0; i < m; ++i) { + in >> ex >> x >> y >> ex; + g->add_edge(x, y); + } + auto v = g->print(); + out << result(v) << endl; + delete g; + } else if(t == "double") { + matrix_graph<double>* g = new matrix_graph<double>(n); + double x,y; + for(int i = 0; i < n; ++i) { + in >> x; + g->add_node(x); + } + char ex; + for(int i = 0; i < m; ++i) { + in >> ex >> x >> y >> ex; + g->add_edge(x, y); + } + auto v = g->print(); + out << result(v) << endl; + delete g; + } else { + matrix_graph<char>* g = new matrix_graph<char>(n); + char x,y; + for(int i = 0; i < n; ++i) { + in >> x; + g->add_node(x); + } + char ex; + for(int i = 0; i < m; ++i) { + in >> ex >> x >> y >> ex; + g->add_edge(x, y); + } + + auto v = g->print(); + out << result(v) << endl; + delete g; + } + } + in.close(); + out.close(); + return 0; +} |