Advertisement
Guest User

Untitled

a guest
Oct 20th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4. #include <math.h>
  5. #define INF 900000000
  6.  
  7. using namespace std;
  8.  
  9. void dfs1(map<string, vector<string>>* g, map<string, int>* color, vector<string>* order, string curr){
  10. (*color)[curr] = 1;
  11.  
  12. for (int i = 0; i < (*g)[curr].size(); i++){
  13. string to = (*g)[curr][i];
  14.  
  15. if ((*color)[to] == 0){
  16. dfs1(g, color, order, to);
  17. }
  18. }
  19.  
  20. (*order).push_back(curr);
  21. (*color)[curr] = 2;
  22. }
  23.  
  24. void dfs2(map<string, vector<string>>* g, map<string, int>* component, int componentNo, string curr){
  25. (*component)[curr] = componentNo;
  26.  
  27. for (int i = 0; i < (*g)[curr].size(); i++){
  28. string to = (*g)[curr][i];
  29.  
  30. if ((*component)[to] == -1){
  31. dfs2(g, component, componentNo, to);
  32. }
  33. }
  34. }
  35.  
  36. int main(){
  37. int n, m;
  38. cin >> n >> m;
  39.  
  40. map<string, vector<string>> graph;
  41. map<string, vector<string>> reversedGraph;
  42. map<string, int> components;
  43. map<string, int> color;
  44.  
  45. vector<string> guests;
  46. vector<string> order;
  47.  
  48. for (int i = 0; i < n; i++){
  49. string s;
  50. cin >> s;
  51.  
  52. guests.push_back(s);
  53.  
  54. graph['-' + s] = vector<string>(0);
  55. graph['+' + s] = vector<string>(0);
  56.  
  57. reversedGraph['-' + s] = vector<string>(0);
  58. reversedGraph['+' + s] = vector<string>(0);
  59.  
  60. color['-' + s] = 0;
  61. color['+' + s] = 0;
  62.  
  63. components['-' + s] = -1;
  64. components['+' + s] = -1;
  65. }
  66.  
  67.  
  68. for (int i = 0; i < m; i++){
  69. string from, to;
  70. cin >> from >> to >> to;
  71.  
  72. graph[from].push_back(to);
  73. reversedGraph[to].push_back(from);
  74.  
  75. if (from[0] == '-')
  76. from[0] = '+';
  77. else
  78. from[0] = '-';
  79.  
  80. if (to[0] == '-')
  81. to[0] = '+';
  82. else
  83. to[0] = '-';
  84.  
  85. graph[from].push_back(to);
  86. reversedGraph[to].push_back(from);
  87. }
  88.  
  89.  
  90. for (int i = 0; i < n; i++){
  91. if (color['-' + guests[i]] == 0){
  92. dfs1(&graph, &color, &order, '-' + guests[i]);
  93. }
  94.  
  95. if (color['+' + guests[i]] == 0){
  96. dfs1(&graph, &color, &order, '+' + guests[i]);
  97. }
  98. }
  99.  
  100.  
  101. int cmp = 0;
  102.  
  103. for (int i = 0; i < order.size(); i++){
  104. string vert = order[order.size() - 1 - i];
  105.  
  106. if (components[vert] == -1){
  107. cmp++;
  108. dfs2(&reversedGraph, &components, cmp, vert);
  109. }
  110. }
  111.  
  112. bool isCycle = false;
  113. vector<string> answer;
  114.  
  115. for (int i = 0; i < guests.size(); i++){
  116. if (components['-' + guests[i]] == components['+' + guests[i]]){
  117. isCycle = true;
  118. break;
  119. }
  120. else{
  121. if (components['+' + guests[i]] < components['-' + guests[i]]){
  122. answer.push_back(guests[i]);
  123. }
  124. }
  125. // cout << endl;
  126. // cout << '-' + guests[i] << " " << components['-' + guests[i]] << endl;
  127. // cout << '+' + guests[i] << " " << components['+' + guests[i]] << endl;
  128. // cout << endl;
  129. }
  130.  
  131. if (!isCycle && answer.size() != 0){
  132. cout << answer.size() << endl;
  133. for (int i = 0; i < answer.size(); i++){
  134. cout << answer[i] << endl;
  135. }
  136. }
  137. else{
  138. cout << -1;
  139. }
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement