Advertisement
Guest User

Untitled

a guest
Feb 29th, 2020
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <map>
  5.  
  6. using namespace std;
  7.  
  8. struct Edge {
  9.     int start;
  10.     int end;
  11.     int weight;
  12.     double w;
  13. };
  14.  
  15. int n, m;
  16. int INF = 2147483647;
  17. vector <double> d(1001, 0);
  18. vector <Edge> ed;
  19. int p[1001];
  20. int b;
  21. vector <int> ans;
  22. map<pair<int, int>, int> mp;
  23.  
  24.  
  25. void otvet() {
  26.     ans.clear();
  27.     int v = b;
  28.     for (int i = 0; i < 2*n; i++) {
  29.         v = p[v];
  30.     }
  31.     ans.push_back(v);
  32.     int tmp = p[v];
  33.     while(tmp != v) {
  34.         ans.push_back(tmp);
  35.         tmp = p[tmp];
  36.     }
  37.     reverse(ans.begin(), ans.end());
  38. }
  39.  
  40.  
  41. bool FB() {
  42.     bool f = false;
  43.     for (int k = 0; k < n - 1; k++)
  44.         for (Edge e : ed)
  45.             if (d[e.end] > d[e.start] + e.w) {
  46.                 d[e.end] = d[e.start] + e.w;
  47.                 p[e.end] = e.start;
  48.             }
  49.     for (Edge e: ed) {
  50.         if (d[e.end] > d[e.start] + e.w) {
  51.             b = e.end;
  52.             p[b] = e.start;
  53.             f = true;
  54.             break;
  55.             //return f;
  56.         }
  57.     }
  58.     if (f)
  59.         otvet();
  60.     return f;
  61. }
  62.  
  63.  
  64. int main() {
  65.     cin >> n >> m;
  66.     int ma = 0;
  67.     int mi = INF;
  68.     for (int i = 0; i < m; i++) {
  69.         Edge e;
  70.         cin >> e.start >> e.end >> e.weight;
  71.         e.w = e.weight;
  72.         mp[make_pair(e.start, e.end)] = i + 1;
  73.         mi = min(mi, e.weight);
  74.         ma = max(ma, e.weight);
  75.         ed.push_back(e);
  76.     }
  77.  
  78.     double l = mi;
  79.     double r = ma;
  80.     double k = 1.0 / (n*n);
  81.     while (r - l > k) {
  82.         double mid = (l+r) / 2;
  83.         for (int i = 0; i < ed.size(); i++) {
  84.             ed[i].w = ed[i].weight - mid;
  85.         }
  86.         fill(d.begin(), d.end(), 0);
  87.         bool g = FB();
  88.         if(g)
  89.             r = mid;
  90.         else
  91.             l = mid;
  92.     }
  93.     cout << l << "\n";
  94.     cout << ans.size() << "\n";
  95.     for (int i = 0; i < ans.size() - 1; i++) {
  96.         cout << mp[make_pair(ans[i], ans[i+1])] << " ";
  97.     }
  98.     cout << mp[make_pair(ans[ans.size() - 1], ans[0])];
  99.  
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement