Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.37 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include "optimization.h"
  3.  
  4. using namespace std;
  5.  
  6. const int MAXN = 1e4;
  7.  
  8. long long len[4194310][25];
  9. int edge[25];
  10.  
  11. vector <int>
  12.  
  13. int test(){
  14.  
  15. };
  16.  
  17. int main() {
  18. ios_base::sync_with_stdio(false);
  19. cin.tie(0);
  20. cout.tie(0);
  21.  
  22. int n, m;
  23. cin >> n >> m;
  24.  
  25. for (int i = 0; i < 23; i++) {
  26. edge[i] = 0;
  27. // edge[i] = edge[i] | (1 << i);
  28. }
  29.  
  30. int u, v;
  31. for (int i = 0; i < m; i++) {
  32. cin >> u >> v;
  33. u--;
  34. v--;
  35. if (u != v)
  36. edge[u] = edge[u] | (1 << v);
  37.  
  38. }
  39.  
  40. for (int A = 0; A < (1 << n); A++) {
  41. for (int i = 0; i < n; i++) {
  42. len[A][i] = 0;
  43. }
  44. }
  45.  
  46.  
  47. for (int A = 0; A < (1 << n); A++) {
  48. for (int x = 0; x < n; x++) {
  49.  
  50. if (!((A >> x) & 1)) { // x - добавляемый элемент
  51. for (int j = 0; j < n; j++) {
  52. if ((A >> j) & 1) { // элемент j в мн-ве
  53. if ((edge[j] >> x) & 1) { //есть ребро
  54. // cout << A <<' '<< j <<' ' <<x << endl;
  55. len[A | (1 << x)][x] = max(len[A | (1 << x)][x] ,len[A][j] + 1);
  56. }
  57. }
  58. }
  59. }
  60. }
  61. }
  62.  
  63. long long ans = 0;
  64. long long finish;
  65. long long temp_A;
  66. for (int A = 0; A < (1 << n); A++) {
  67. for (int i = 0; i < n; i++) {
  68. if (len[A][i] > ans) {
  69. temp_A = A;
  70. ans = len[A][i];
  71. finish = i;
  72. }
  73. }
  74. }
  75.  
  76. cout << ans << endl;
  77. long long bit_path = 0;
  78. vector <long long> path;
  79. for (int i = 0; i < ans; i++) {
  80.  
  81. for (int i = 0; i < n; i++) {
  82. if (len[(temp_A & ~(1 << finish))][i] + 1 == len[temp_A][finish] && ((edge[i] >> finish) & 1) && !((bit_path >> i) & 1)) {
  83. bit_path = bit_path | (1 << finish);
  84. temp_A = (temp_A & ~(1 << finish));
  85. //cout << bit_path << ' ' << temp_A << ' ' << finish;
  86. path.push_back(finish+1);
  87. finish = i;
  88. break;
  89. }
  90. }
  91.  
  92. }
  93. path.push_back(finish+1);
  94. reverse(path.begin(),path.end());
  95. for (int i = 0; i <= ans; i++) {
  96. cout << path[i] << ' ';
  97. }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement