Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <iomanip>
- using namespace std;
- #define MAX 200000000
- class edge {
- public:
- int c, f, t;
- int u, v, n;
- 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) {};
- int cf() { return c - f; };
- edge* e;
- };
- int n, m, k;
- vector<int> dist;
- vector<edge*> pred;
- vector<vector<edge*>> cities;
- void FordBellman() {
- dist = vector<int>(n, MAX);
- dist[0] = 0;
- pred = vector<edge*>(n, nullptr);
- for (int i = 0; i < n - 1; i++) {
- for (int j = 0; j < cities.size(); j++) {
- for (int r = 0; r < cities[j].size(); r++) {
- edge* e = cities[j][r];
- if (e->cf() == 0)
- continue;
- int u = e->u;
- int v = e->v;
- int time = e->cf() == 1 ? e->t : -e->t;
- if (dist[v] > dist[u] + time) {
- dist[v] = dist[u] + time;
- pred[v] = e;
- }
- }
- }
- }
- }
- int MaxFlow() {
- int time = 0;
- FordBellman();
- if (pred[n - 1] == nullptr) {
- return MAX;
- }
- for (int i = n - 1; i != 0; i = pred[i]->u) {
- int t = pred[i]->cf() == 1 ? pred[i]->t : -pred[i]->t;
- pred[i]->f += 1;
- pred[i]->e->f -= 1;
- time += t;
- }
- return time;
- }
- int main() {
- freopen("brides.in", "r", stdin);
- freopen("brides.out", "w", stdout);
- cin >> n >> m >> k;
- cities.resize(n, vector<edge*>());
- for (int i = 0; i < m; i++) {
- int u, v;
- int t;
- cin >> u >> v >> t;
- edge* e1 = new edge(1, 0, t, u - 1, v - 1, i + 1);
- edge* e2 = new edge(1, 0, t, v - 1, u - 1, i + 1);
- e1->e = e2;
- e2->e = e1;
- cities[u - 1].push_back(e1);
- cities[v - 1].push_back(e2);
- }
- int time = 0;
- for (int i = 0; i < k; i++) {
- int tmp = MaxFlow();
- if (tmp == MAX) {
- cout << -1;
- return 0;
- }
- time += tmp;
- }
- printf("%.7f\n", time / (double)k);
- vector<vector<int>> ans;
- for (int i = 0; i < k; i++) {
- ans.push_back(vector<int>());
- for (int j = 0; j != n - 1;) {
- for (int r = 0; r < cities[j].size(); r++) {
- edge* e = cities[j][r];
- if (e->cf() == 0) {
- e->c = MAX;
- j = e->v;
- ans.back().push_back(e->n);
- break;
- }
- }
- }
- }
- for (auto vec: ans) {
- cout << vec.size() << " ";
- for (auto elem: vec)
- cout << elem << " ";
- cout << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement