Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <stack>
- #include <queue>
- #include <set>
- #include <conio.h> //
- #include <windows.h>
- using namespace std;
- size_t DFS(vector<vector<bool>> &graph);
- size_t BFS(vector<vector<bool>> &graph);
- void generate_tree(ULONGLONG v_count);
- int main()
- {
- setlocale(0, ""); //
- generate_tree(30000);
- ULONGLONG V, E;
- ifstream in("info.txt");
- if (!in.is_open())
- {
- cerr << "Не удалось открыть файл info";
- return -1;
- }
- in >> V >> E;
- in = ifstream("in.txt");
- if (!in.is_open())
- {
- cerr << "Не удалось открыть файл in";
- return -1;
- }
- vector<vector<bool>> graph(V);
- for (ULONGLONG i = 0; i < V; i++)
- graph[i].resize(V);
- for (ULONGLONG i = 0; i < E; i++)
- {
- ULONGLONG r, c;
- in >> r >> c;
- graph[r][c] = true;
- graph[c][r] = true;
- }
- ofstream out = ofstream("out.txt");
- clock_t s = clock(); //
- if (V - DFS(graph) == 0)
- {
- clock_t t = clock() - s; //
- cout << t / 1000 << "." << t % 1000 << "s" << endl; //
- if (E == V - 1)
- out << "Дерево." << endl;
- else out << "Не дерево: есть цикл." << endl;
- }
- else out << "Не дерево: компонент связности больше 1." << endl;
- return 0 * _getch(); //
- }
- size_t DFS(vector<vector<bool>> &graph)
- {
- ULONGLONG x = 0, y = 0; //
- set<ULONGLONG> set;
- stack<ULONGLONG> stack;
- stack.push(0);
- while (!stack.empty())
- {
- y++; //
- bool down = false;
- int r = stack.top();
- set.insert(r);
- for (int c = r; c < graph.size() && !down; c++, x++) //
- if (down = graph[r][c] == 1 && set.count(c) == 0)
- stack.push(c);
- x--; //
- if (!down) stack.pop();
- }
- cout << "Итераций внешнего цикла: " << y << ", итераций вложенного цикла: " << x << endl; //
- return set.size();
- }
- size_t BFS(vector<vector<bool>> &graph)
- {
- ULONGLONG x = 0, y = 0; //
- set<ULONGLONG> set;
- queue<ULONGLONG> queue;
- queue.push(0);
- while (!queue.empty())
- {
- y++; //
- ULONGLONG r = queue.front();
- set.insert(r);
- queue.pop();
- for (int c = 0; c < graph.size(); c++, x++)//
- if (graph[r][c] == 1 && set.count(c) == 0)
- queue.push(c);
- x--; //
- }
- cout << "Итераций внешнего цикла: " << y << ", итераций вложенного цикла: " << x << endl; //
- return set.size();
- }
- void generate_tree(ULONGLONG v_count)
- {
- ofstream out("info.txt");
- out << v_count << ' ' << v_count - 1 << endl;
- out = ofstream("in.txt");
- ULONGLONG v_num = 0, dif = 1;
- for (ULONGLONG i = 0; i < v_count - 1; i++)
- {
- out << v_num << ' ' << dif++ << endl;
- v_num += dif % 2;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement