Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <map>
- using namespace std;
- struct Edge {
- int start;
- int end;
- int weight;
- double w;
- };
- int n, m;
- int INF = 2147483647;
- vector <double> d(1001, 0);
- vector <Edge> ed;
- int p[1001];
- int b;
- vector <int> ans;
- map<pair<int, int>, int> mp;
- void otvet() {
- ans.clear();
- int v = b;
- for (int i = 0; i < 2*n; i++) {
- v = p[v];
- }
- ans.push_back(v);
- int tmp = p[v];
- while(tmp != v) {
- ans.push_back(tmp);
- tmp = p[tmp];
- }
- reverse(ans.begin(), ans.end());
- }
- bool FB() {
- bool f = false;
- for (int k = 0; k < n - 1; k++)
- for (Edge e : ed)
- if (d[e.end] > d[e.start] + e.w) {
- d[e.end] = d[e.start] + e.w;
- p[e.end] = e.start;
- }
- for (Edge e: ed) {
- if (d[e.end] > d[e.start] + e.w) {
- b = e.end;
- p[b] = e.start;
- f = true;
- break;
- //return f;
- }
- }
- if (f)
- otvet();
- return f;
- }
- int main() {
- cin >> n >> m;
- int ma = 0;
- int mi = INF;
- for (int i = 0; i < m; i++) {
- Edge e;
- cin >> e.start >> e.end >> e.weight;
- e.w = e.weight;
- mp[make_pair(e.start, e.end)] = i + 1;
- mi = min(mi, e.weight);
- ma = max(ma, e.weight);
- ed.push_back(e);
- }
- double l = mi;
- double r = ma;
- double k = 1.0 / (n*n);
- while (r - l > k) {
- double mid = (l+r) / 2;
- for (int i = 0; i < ed.size(); i++) {
- ed[i].w = ed[i].weight - mid;
- }
- fill(d.begin(), d.end(), 0);
- bool g = FB();
- if(g)
- r = mid;
- else
- l = mid;
- }
- cout << l << "\n";
- cout << ans.size() << "\n";
- for (int i = 0; i < ans.size() - 1; i++) {
- cout << mp[make_pair(ans[i], ans[i+1])] << " ";
- }
- cout << mp[make_pair(ans[ans.size() - 1], ans[0])];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement