Advertisement
Guest User

Don't look plz

a guest
Oct 17th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.52 KB | None | 0 0
  1. //#define _CRT_SECURE_NO_WARNINGS
  2. //#include <iostream>
  3. //#include <vector>
  4. //#include <queue>
  5. //#include <set>
  6. //#include <stack>
  7. //#include <algorithm>
  8. //
  9. //using namespace std;
  10. //
  11. //int START, END, N;
  12. //vector <vector <int>> FLOWS;
  13. //vector <vector <int>> GRAPH;
  14. //
  15. //int bfs(int vertex) {
  16. // queue<pair<int, int>> q;
  17. // set<int> visited;
  18. // stack <pair<int, int>> stack_;
  19. // q.push(make_pair(vertex, -1));
  20. // while (!q.empty()) {
  21. // pair<int, int> temp = q.front();
  22. // q.pop();
  23. // stack_.push(temp);
  24. // if (temp.first == END) {
  25. // break;
  26. // }
  27. // for (int i = 0; i < N; i++) {
  28. // if (visited.find(i) != visited.end()) {
  29. // continue;
  30. // }
  31. // if (GRAPH[temp.first][i] - FLOWS[temp.first][i] > 0) {
  32. // visited.insert(i);
  33. // q.push(make_pair(i, temp.first));
  34. // }
  35. // }
  36. // }
  37. // vector <int> way;
  38. // int cur = END;
  39. // while (!stack_.empty()) {
  40. // auto i = stack_.top();
  41. // stack_.pop();
  42. // if (i.first == cur) {
  43. // cur = i.second;
  44. // way.push_back(i.first);
  45. // }
  46. // }
  47. // reverse(way.begin(), way.end());
  48. // if (way.size() == 0) {
  49. // return -1;
  50. // }
  51. //
  52. // int flow = 10e9;
  53. //
  54. // for (int i = 0; i < way.size() - 1; i++) {
  55. // flow = min(GRAPH[way[i]][way[i + 1]] - FLOWS[way[i]][way[i + 1]], flow);
  56. // }
  57. // for (int i = 0; i < way.size() - 1; i++) {
  58. // FLOWS[way[i]][way[i + 1]] += flow;
  59. // FLOWS[way[i + 1]][way[i]] -= flow;
  60. // }
  61. // return flow;
  62. //}
  63. //
  64. //int main() {
  65. // freopen("input.txt", "r", stdin);
  66. // freopen("output.txt", "w", stdout);
  67. // N;
  68. // int MAXFLOW = 10e9;
  69. // cin >> N;
  70. // vector <int> GRAPHFlags(N);
  71. // for (int i = 0; i < N; cin >> GRAPHFlags[i], i++) {}
  72. // GRAPH = vector <vector <int>>(N + 2, vector <int>(N + 2));
  73. // for (int i = 0; i < N; i++) {
  74. // for (int j = 0; j < N; cin >> GRAPH[i][j], j++) {}
  75. // }
  76. // START = N, END = N + 1;
  77. //
  78. // for (int i = 0; i < N; i++) {
  79. // if (GRAPHFlags[i] == 1) {
  80. // GRAPH[START][i] = MAXFLOW;
  81. // }
  82. // }
  83. //
  84. // for (int i = 0; i < N; i++) {
  85. // if (GRAPHFlags[i] == 2) {
  86. // GRAPH[i][END] = MAXFLOW;
  87. // }
  88. // }
  89. //
  90. // N += 2;
  91. // FLOWS = vector <vector <int>>(N, vector <int>(N, 0));
  92. //
  93. // while (true) {
  94. // int temp = bfs(START);
  95. // if (temp < 0) {
  96. // break;
  97. // }
  98. // }
  99. //
  100. // int res = 0;
  101. // for (int i = 0; i < N; i++) {
  102. // res += FLOWS[i][END];
  103. // }
  104. // cout << res << endl;
  105. // return 0;
  106. //}
  107.  
  108. #define _CRT_SECURE_NO_WARNINGS
  109. #include <iostream>
  110. #include <vector>
  111. #include <queue>
  112. #include <set>
  113. #include <stack>
  114. #include <algorithm>
  115.  
  116. using namespace std;
  117.  
  118. struct Edge;
  119.  
  120. int N, M, K;
  121. int INFIMUM = 10e6;
  122. vector <vector <int>> ROADS;
  123. vector <int> PHI;
  124. int START, FINISH = 0;
  125. vector <vector <Edge>> EDGES;
  126. vector <vector <Edge*>> BACKEDGES;
  127. vector <Edge*> WAY;
  128. set <int> VISITED;
  129.  
  130. struct Edge {
  131. int from;
  132. int target;
  133. int cost;
  134. int flow;
  135. int indent;
  136. int maxCapacity;
  137.  
  138. Edge(int from = -1, int target = -1, int cost = -1, int flow = -1, int maxCapacity = -1, int indent = -1) :
  139. from(from), target(target), cost(cost), flow(flow), maxCapacity(maxCapacity), indent(indent) {};
  140.  
  141. int getCapacity() {
  142. return maxCapacity - flow;
  143. }
  144.  
  145. int getCost() const {
  146. return cost + PHI[target] - PHI[from];
  147. }
  148.  
  149. };
  150.  
  151. struct DijkstraStruct {
  152. int val;
  153. int index;
  154. Edge* edge;
  155. DijkstraStruct(int val = 0, int index = 0, Edge* edge = nullptr) : val(val), index(index), edge(edge) {};
  156. };
  157.  
  158. const bool operator < (const Edge& left, const Edge& right) {
  159. return left.getCost() < right.getCost();
  160. }
  161.  
  162. const bool operator < (const DijkstraStruct& left, const DijkstraStruct& right) {
  163. return left.val > right.val;
  164. }
  165.  
  166. Edge* getEdgeBack(Edge* e) {
  167. // for (auto edge : EDGES[e->target]) {
  168. // if (edge.indent == -e->indent && edge.from == e->target) {
  169. // return &edge;
  170. // }
  171. // }
  172. for (int i = 0; i < EDGES[e->target].size(); i++) {
  173. if (EDGES[e->target][i].indent == -e->indent && EDGES[e->target][i].from == e->target) {
  174. return &EDGES[e->target][i];
  175. }
  176. }
  177. }
  178.  
  179. int dijkstra() {
  180. set <int> visitied;
  181. vector <DijkstraStruct> verts(N);
  182. /*for (auto temp : verts) {
  183. temp.val = INFIMUM;
  184. }*/
  185. for (int i = 0; i < verts.size(); i++) {
  186. verts[i].val = INFIMUM;
  187. verts[i].index = i;
  188. }
  189. verts[FINISH].val = 0;
  190. priority_queue<DijkstraStruct> queue;
  191. queue.push(verts[FINISH]);
  192. while (!queue.empty()) {
  193. DijkstraStruct temp = queue.top();
  194. queue.pop();
  195. if (visitied.find(temp.index) != visitied.end()) {
  196. continue;
  197. }
  198. visitied.insert(temp.index);
  199. /*for (auto edge : BACKEDGES[temp.index]) {
  200. if (edge.getCapacity() > 0) {
  201. if (verts[edge.from].val > verts[edge.target].val + edge.getCost()) {
  202. verts[edge.from] = DijkstraStruct(verts[edge.target].val + edge.getCost(), edge.from, &edge);
  203. queue.push(verts[edge.from]);
  204. }
  205. }
  206. }*/
  207. for (int i = 0; i < BACKEDGES[temp.index].size(); i++) {
  208. auto edge = BACKEDGES[temp.index][i];
  209. if (edge->getCapacity() > 0) {
  210. if (verts[edge->from].val > verts[edge->target].val + edge->getCost()) {
  211. verts[edge->from] = DijkstraStruct(verts[edge->target].val + edge->getCost(), edge->from, BACKEDGES[temp.index][i]);
  212. queue.push(verts[edge->from]);
  213. }
  214. }
  215. }
  216. }
  217. if (verts[START].val == INFIMUM) {
  218. return 0;
  219. }
  220. for (int i = 0; i < N; i++) {
  221. PHI[i] += verts[i].val;
  222. }
  223. int cur = START;
  224. vector <int> way;
  225. while (cur != FINISH) {
  226. DijkstraStruct temp = verts[cur];
  227. temp.edge->flow += 1;
  228. Edge* backedge = nullptr;
  229. backedge = getEdgeBack(temp.edge);
  230. if (backedge != nullptr) {
  231. backedge->flow -= 1;
  232. }
  233.  
  234. cur = temp.edge->target;
  235. }
  236. return 1;
  237. }
  238.  
  239. bool getWay(int v = START) {
  240. if (v == START) {
  241. WAY.clear();
  242. VISITED.clear();
  243. }
  244. if (v == FINISH) {
  245. return true;
  246. }
  247. if (VISITED.find(v) != VISITED.end()) {
  248. return false;
  249. }
  250. VISITED.insert(v);
  251. for (int i = 0; i < EDGES[v].size(); i++) {
  252. if (EDGES[v][i].flow > 0) {
  253. if (getWay(EDGES[v][i].target)) {
  254. WAY.push_back(&EDGES[v][i]);
  255. return true;
  256. }
  257. }
  258. }
  259. }
  260.  
  261. int main() {
  262. freopen("brides.in", "r", stdin);
  263. freopen("brides.out", "w", stdout);
  264. cin >> N >> M >> K;
  265. ROADS = vector <vector <int>>(M, vector<int>(3));
  266. for (int i = 0; i < M; i++) {
  267. for (int j = 0; j < 3; j++) {
  268. cin >> ROADS[i][j];
  269. }
  270. ROADS[i].push_back(i + 1);
  271. }
  272.  
  273. N += 1;
  274. START = 0;
  275. FINISH = N - 1;
  276. PHI = vector <int>(N);
  277. PHI[FINISH] = 0;
  278. EDGES = vector <vector <Edge>>(N);
  279. BACKEDGES = vector <vector <Edge*>>(N);
  280.  
  281. EDGES[0].push_back(Edge(0, 1, 0, 0, K, 0));
  282. EDGES[1].push_back(Edge(1, 0, 0, 0, 0, 0));
  283. BACKEDGES[0].push_back(new Edge(0, 1, 0, 0, 0, 0));
  284. BACKEDGES[1].push_back(new Edge(1, 0, 0, 0, K, 0));
  285.  
  286. for (auto r : ROADS) {
  287. EDGES[r[0]].push_back(Edge(r[0], r[1], r[2], 0, 1, r[3]));
  288. EDGES[r[1]].push_back(Edge(r[1], r[0], r[2], 0, 1, r[3]));
  289. EDGES[r[0]].push_back(Edge(r[0], r[1], -r[2], 0, 0, -r[3]));
  290. EDGES[r[1]].push_back(Edge(r[1], r[0], -r[2], 0, 0, -r[3]));
  291. }
  292.  
  293. /*for (auto line : EDGES) {
  294. for (auto edge : line) {
  295. BACKEDGES[edge.target].push_back(&edge);
  296. }
  297. }*/
  298. for (int i = 0; i < EDGES.size(); i++) {
  299. for (int j = 0; j < EDGES[i].size(); j++) {
  300. BACKEDGES[EDGES[i][j].target].push_back(&EDGES[i][j]);
  301. }
  302. }
  303.  
  304. int temp = 1;
  305. while (temp > 0) {
  306. temp = dijkstra();
  307. }
  308.  
  309. int flowVal = 0;
  310. for (size_t i = 0; i < EDGES[START].size(); i++) {
  311. if (EDGES[START][i].flow > 0) {
  312. flowVal += EDGES[START][i].flow;
  313. }
  314. }
  315.  
  316. if (flowVal < K) {
  317. cout << "-1" << endl;
  318. return 0;
  319. }
  320. double average = 0.0;
  321. double tempSum = 0;
  322. for (auto i : EDGES) {
  323. for (auto elem : i) {
  324. if (elem.flow > 0) {
  325. tempSum += elem.cost;
  326. }
  327. }
  328. }
  329. average = tempSum / K;
  330. vector <vector <Edge*>> pathWays;
  331.  
  332. for (int i = 0; i < K; i++) {
  333. getWay();
  334. vector <Edge*> tmpWay = WAY;
  335. reverse(tmpWay.begin(), tmpWay.end());
  336. pathWays.push_back(tmpWay);
  337. for (int j = 0; j < WAY.size(); j++) {
  338. WAY[j]->flow -= 1;
  339. }
  340. }
  341.  
  342. printf("%0.6f\n", average);
  343.  
  344. for (auto i : pathWays) {
  345. cout << i.size() - 1 << " ";
  346. for (int j = 1; j < i.size(); j++) {
  347. cout << i[j]->indent << " ";
  348. }
  349. cout << endl;
  350. }
  351. //priority_queue<int> test;
  352. //test.push(-5);
  353. //test.push(-1);
  354. //test.push(-1);
  355. //while (!test.empty()) {
  356. // cout << test.top() << endl;
  357. // test.pop();
  358. //}
  359. return 0;
  360. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement