Advertisement
Dzham

Untitled

Apr 18th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <iterator>
  5. #include <unordered_map>
  6. #include <unordered_set>
  7. #include <string>
  8. #include <set>
  9. #include <random>
  10. #include <deque>
  11.  
  12. using namespace std;
  13.  
  14. void print(vector<int> data) {
  15. for (auto elem : data) {
  16. cout << elem << " ";
  17. }
  18. cout << " TEMPLAR\n";
  19. }
  20.  
  21. class Graph {
  22. public:
  23. int vertices;
  24. vector<set<int>> adjacency_set;
  25. vector<int>* cyc;
  26.  
  27. public:
  28. Graph() {}
  29.  
  30. Graph(int number_vertices, vector<vector<int>> graph) {
  31. vertices = number_vertices;
  32. adjacency_set.resize(vertices);
  33. for (int i = 0; i < vertices; i++) {
  34. adjacency_set[i] = set<int>();
  35. }
  36. for (int i = 0; i < number_vertices; i++) {
  37. for (size_t j = 0; j < graph[i].size(); j++) {
  38. adjacency_set[i].insert(graph[i][j]);
  39. }
  40. }
  41. }
  42. /*
  43. int get_number_vertices() {
  44. return vertices;
  45. }
  46.  
  47. int get_numbers_edges() {
  48. int result = 0;
  49. for (int i = 0; i < vertices; i++) {
  50. result += adjacency_set[i].size();
  51. }
  52. return result;
  53. }
  54.  
  55. bool is_neighbors(int first, int second) {
  56. return adjacency_set[first].find(second) != adjacency_set[first].end();
  57. }
  58.  
  59. set<int> get_neighbors(int vert) {
  60. return adjacency_set[vert];
  61. }
  62.  
  63. int get_number_neighbors(int vert) {
  64. return adjacency_set[vert].size();
  65. }
  66.  
  67. int get_number_component();
  68. */
  69. void is_cycle();
  70.  
  71. void is_dic();
  72.  
  73. void Dijkstra(int start, int finish) {
  74. int BIG = 100000 + 1;
  75. vector<int>* dist = new vector<int>(vertices);
  76. for (int i = 0; i < vertices; i++) {
  77. (*dist)[i] = BIG;
  78. }
  79. vector<int>* vertic = new vector<int>(vertices);
  80. set<int>* was = new set<int>;
  81. (*dist)[start] = 0;
  82. while (true) {
  83. int min_dist = BIG;
  84. int min_vert;
  85. for (int i = 0; i < vertices; i++) {
  86. if ((*dist)[i] < min_dist && was->find(i) == was->end()) {
  87. min_dist = dist->at(i);
  88. min_vert = i;
  89. break;
  90. }
  91. }
  92. if (min_dist == BIG) {
  93. break;
  94. }
  95. int v = min_vert;
  96. was->insert(v);
  97. for (int vert : adjacency_set[v]) {
  98. if (dist->at(v) + 1 < dist->at(vert)) {
  99. dist->at(vert) = dist->at(v) + 1;
  100. vertic->at(vert) = v;
  101. }
  102. }
  103. }
  104. if (dist->at(finish) != BIG) {
  105. if (dist->at(finish)) {
  106. cout << dist->at(finish) << "\n";
  107. vector<int> res(dist->at(finish) + 1);
  108. int i = dist->at(finish);
  109. res[i] = finish + 1;
  110. int extra = finish;
  111. while (i != 0) {
  112. res[i - 1] = (*vertic)[extra] + 1;
  113. extra = (*vertic)[extra];
  114. i--;
  115. }
  116. print(res);
  117. } else {
  118. cout << 0 << " zerowayTEMPLARIN" << '\n';
  119. }
  120. } else {
  121. cout << -1 << " NOTEMPLAR" << '\n';
  122. }
  123. }
  124. };
  125.  
  126. class superGraph {
  127. private:
  128. int size_g;
  129. std::vector<std::vector<int>> data;
  130. std::vector<int> used;
  131.  
  132. public:
  133. std::vector<bool> isused;
  134. std::vector<int> distance;
  135. bool isisdouble = true;
  136. bool isiscycle = false;
  137. std::vector<int> cyclepath;
  138. std::unordered_map<int, int> parents;
  139. int max_path = 0;
  140.  
  141. superGraph() {
  142. }
  143.  
  144. explicit superGraph(int n) {
  145. data.resize(n);
  146. isused.resize(n);
  147. size_g = n;
  148. }
  149.  
  150. void insert(int a, int b) {
  151. if (a != b) {
  152. data[a - 1].push_back(b);
  153. data[b - 1].push_back(a);
  154. }
  155. }
  156.  
  157. explicit superGraph(std::vector<std::vector<int>> graph) {
  158. isused.resize(graph.size());
  159. size_g = graph.size();
  160. data = graph;
  161. }
  162.  
  163. void printgraph() {
  164. for (int i = 0; i < data.size(); i++) {
  165. for (auto j : data[i]) {
  166. std::cout << j << " ";
  167. }
  168. std::cout << '\n';
  169. }
  170. }
  171.  
  172. void Dijkstra(int a, int b) {
  173. isused.clear();
  174. isused.resize(size_g);
  175. isused[a - 1] = true;
  176. std::vector<int> result;
  177. std::vector<int> way;
  178. std::vector<std::vector<int>> ways;
  179. ways.resize(size_g);
  180. result = data[a - 1];
  181. int v;
  182. for (int i = 0; i < size_g; i++) {
  183. if (result[i] != 200000) {
  184. ways[i].push_back(i + 1);
  185. }
  186. }
  187. for (int j = 0; j < size_g; j++) {
  188. v = -1;
  189. for (int i = 0; i < size_g; i++) {
  190. if (!isused[i] && ((v == -1) || result[v] > result[i])) {
  191. v = i;
  192. }
  193. }
  194. if (v == -1) {
  195. v = size_g - 1;
  196. }
  197. isused[v] = true;
  198. for (int i = 0; i < size_g; i++) {
  199. if (result[i] > result[v] + data[i][v]) {
  200. ways[i].clear();
  201. ways[i].insert(ways[i].end(), ways[v].begin(), ways[v].end());
  202. ways[i].push_back(i + 1);
  203. result[i] = result[v] + data[v][i];
  204. }
  205. }
  206. }
  207.  
  208. if (result[b - 1] <= 0 || result[b - 1] == 200000) {
  209. std::cout << -1 << " NODZHAM" << '\n';
  210. } else {
  211. std::cout << result[b - 1] << "\n";
  212. std::cout << a;
  213. for (auto i : ways[b - 1]) {
  214. std::cout << " " << i;
  215. }
  216. std::cout << " DZHAM" << '\n';
  217. }
  218. }
  219. };
  220.  
  221. int main() {
  222. int N, M;
  223. int a, b;
  224. std::cin >> N;
  225. if (N != 0) {
  226. std::vector<std::vector<int>> dat;
  227. std::vector<std::vector<int>> ebala;
  228. ebala.resize(N);
  229. std::vector<int> line;
  230. //for (int i = 0; i < N; i++) {
  231. // for (int j = 0; j < N; j++) {
  232. // std::cin >> a;
  233. // if (a == 0) {
  234. // line.push_back(200000);
  235. // } else {
  236. // line.push_back(a);
  237. // }
  238. // }
  239. // dat.push_back(line);
  240. // line.clear();
  241. //}
  242. std::vector<int> zerosones;
  243. zerosones.push_back(0);
  244. zerosones.push_back(0);
  245. zerosones.push_back(0);
  246. zerosones.push_back(0);
  247. zerosones.push_back(1);
  248. for (int i = 0; i < N; i++) {
  249. for (int j = 0; j < N; j++) {
  250. a = zerosones[rand() % 5];
  251. if (a == 0) {
  252. line.push_back(200000);
  253. } else {
  254. line.push_back(a);
  255. if (i <= j) {
  256. ebala[i].push_back(j);
  257. ebala[j].push_back(i);
  258. }
  259. }
  260. }
  261. dat.push_back(line);
  262. line.clear();
  263. }
  264. for (int i = 0; i < N; i++) {
  265. for (int j = i; j < N; j++) {
  266. dat[j][i] = dat[i][j];
  267. }
  268. }
  269. for (int i = 0; i < N; i++) {
  270. std::cout << i + 1 << ":\t";
  271. for (int j = 0; j < N; j++) {
  272. if (dat[i][j] == 200000) {
  273. std::cout << 0 << '\t';
  274. } else {
  275. std::cout << dat[i][j] << '\t';
  276. }
  277. }
  278. std::cout << '\n';
  279. }
  280. superGraph graph(dat);
  281. Graph gr(N, ebala);
  282. for (int i = 0; i < 10; i++) {
  283. a = rand() % N;
  284. b = rand() % N;
  285. if (a == b) {
  286. std::cout << 0 << "zerowayDZHAM\n";
  287. std::cout << 0 << "zerowayTEMPLAR\n";
  288. } else {
  289. graph.Dijkstra(a + 1, b + 1);
  290. gr.Dijkstra(a, b);
  291. }
  292. }
  293. }
  294. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement