Advertisement
tumaryui

Untitled

May 26th, 2020
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.40 KB | None | 0 0
  1. #include <bits/stdc++.h> // библиотке включает почти все что может пригодиться
  2. #include <fstream> // библиотека для ввода вывода в файл
  3.  
  4. using namespace std;
  5.  
  6. const double p = 0.2; // вероятность из условия
  7.  
  8.  
  9. int n, m; // количество вершин количество ребер
  10. vector<vector<int> > gr(100000); // граф, хранимый в матрице смежности
  11. bool vis[100000]; // массив посещенности, если vis[i] = 0 значит вершина i не была посещена, если vis[i] = 1 значит вершина i была посещена
  12. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); // генератор случайных чисел
  13.  
  14. // функция возвращает число от 0 до 1, она генерирует случайное число и делит его на максимальное возможное
  15. double get_prob() {
  16. return ((double)rng() / rng.max());
  17. }
  18.  
  19. main() {
  20.  
  21. //вывод в файл
  22. ofstream it; // номера итерации
  23. it.open("it.txt");
  24. ofstream val; // размеры очереди
  25. val.open("val.txt");
  26.  
  27. //ввод графа
  28. cin >> n >> m; // количество вершин и ребер
  29. for(int i = 0; i < m; i++) {
  30. //между l и r есть ребро
  31. int l, r;
  32. cin >> l >> r;
  33. gr[l].push_back(r);
  34. gr[r].push_back(l);
  35. }
  36.  
  37.  
  38. //производим обход графа в ширину
  39. memset(vis, 0, sizeof vis);// отмечаем все вершины непосещенными
  40. queue<int> q; // очередь нужная для обхода в ширину, в ней хранятся вершины, которые ждут обработки, после обработки вершина удаляется из очереди.
  41. int cur = 1; // стартовая вершина
  42. q.push(cur); // помещаем стартовую вершину в очередь для обработки
  43.  
  44. int iter = 0; // номер текущей итерации
  45.  
  46. // пока в очереди есть вершины для обработки выполняем алгоритм
  47. while(!q.empty()) {
  48. int v = q.front(); // берем первую из очереди вершину v
  49.  
  50. q.pop(); // удаляем ее из очереди
  51. vis[v] = 1; // помечаем вершину посещенной
  52. it << iter++ << endl; // в файл it.txt вывожу номер итерации
  53. val << q.size() + 1 << endl; // в файл val.txt вывожу размер очереди, делаю q.size() + 1, т.к до этого была удалена вершина
  54.  
  55. // проходим по всем вершинам соединенным с текущей
  56. for(int i = 0; i < gr[v].size(); i++) {
  57. int to = gr[v][i]; // вершина соединенная с текущей вершиной v
  58. if(!vis[to]) { // если вершина не посещена, то рассматриваем ее
  59. double prob = get_prob(); // получаем какое то число от 0 до 1
  60. if(prob <= p) { // с вероятностью p мы проходим условие
  61. q.push(to); // помещаем вершину to в очередь для обработки
  62. }
  63. }
  64. }
  65. }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement