Advertisement
Guest User

Untitled

a guest
Oct 24th, 2017
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. #define MAX 200000000
  8.  
  9. class edge {
  10. public:
  11. int c, f, t;
  12. int u, v, n;
  13. edge(int c, int f, int t, int u, int v, int n) : c(c), f(f), t(t), u(u), v(v), n(n) {};
  14. int cf() { return c - f; };
  15. edge* e;
  16. };
  17.  
  18. int n, m, k;
  19. vector<int> dist;
  20. vector<edge*> pred;
  21. vector<vector<edge*>> cities;
  22.  
  23. void FordBellman() {
  24. dist = vector<int>(n, MAX);
  25. dist[0] = 0;
  26. pred = vector<edge*>(n, nullptr);
  27.  
  28. for (int i = 0; i < n - 1; i++) {
  29. for (int j = 0; j < cities.size(); j++) {
  30. for (int r = 0; r < cities[j].size(); r++) {
  31. edge* e = cities[j][r];
  32. if (e->cf() == 0)
  33. continue;
  34. int u = e->u;
  35. int v = e->v;
  36. int time = e->cf() == 1 ? e->t : -e->t;
  37. if (dist[v] > dist[u] + time) {
  38. dist[v] = dist[u] + time;
  39. pred[v] = e;
  40. }
  41. }
  42. }
  43. }
  44. }
  45.  
  46. int MaxFlow() {
  47. int time = 0;
  48. FordBellman();
  49. if (pred[n - 1] == nullptr) {
  50. return MAX;
  51. }
  52.  
  53. for (int i = n - 1; i != 0; i = pred[i]->u) {
  54. int t = pred[i]->cf() == 1 ? pred[i]->t : -pred[i]->t;
  55. pred[i]->f += 1;
  56. pred[i]->e->f -= 1;
  57. time += t;
  58. }
  59.  
  60. return time;
  61. }
  62.  
  63. int main() {
  64. freopen("brides.in", "r", stdin);
  65. freopen("brides.out", "w", stdout);
  66.  
  67. cin >> n >> m >> k;
  68.  
  69. cities.resize(n, vector<edge*>());
  70. for (int i = 0; i < m; i++) {
  71. int u, v;
  72. int t;
  73. cin >> u >> v >> t;
  74. edge* e1 = new edge(1, 0, t, u - 1, v - 1, i + 1);
  75. edge* e2 = new edge(1, 0, t, v - 1, u - 1, i + 1);
  76. e1->e = e2;
  77. e2->e = e1;
  78. cities[u - 1].push_back(e1);
  79. cities[v - 1].push_back(e2);
  80. }
  81.  
  82. int time = 0;
  83. for (int i = 0; i < k; i++) {
  84. int tmp = MaxFlow();
  85. if (tmp == MAX) {
  86. cout << -1;
  87. return 0;
  88. }
  89. time += tmp;
  90. }
  91.  
  92. printf("%.7f\n", time / (double)k);
  93. vector<vector<int>> ans;
  94. for (int i = 0; i < k; i++) {
  95. ans.push_back(vector<int>());
  96. for (int j = 0; j != n - 1;) {
  97. for (int r = 0; r < cities[j].size(); r++) {
  98. edge* e = cities[j][r];
  99. if (e->cf() == 0) {
  100. e->c = MAX;
  101. j = e->v;
  102. ans.back().push_back(e->n);
  103. break;
  104. }
  105. }
  106. }
  107. }
  108.  
  109.  
  110. for (auto vec: ans) {
  111. cout << vec.size() << " ";
  112. for (auto elem: vec)
  113. cout << elem << " ";
  114. cout << endl;
  115. }
  116.  
  117. return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement