Advertisement
Malinovsky239

OpenCup 11.11.12

Nov 11th, 2012
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <string>
  7. #include <vector>
  8. #include <map>
  9. #include <set>
  10. #include <cmath>
  11. #include <ctime>
  12. #include <cassert>
  13.  
  14. using namespace std;
  15.  
  16. #define pb push_back
  17. #define mp make_pair
  18. #define sz(A) (int)(A).size()
  19.  
  20. typedef long long LL;
  21. typedef long double LD;
  22.  
  23. const int N = 2005, M = int(2e4), INF = int(1e9);
  24. const LD eps = 1e-10;
  25.  
  26. int a[M], b[M], l[M], dist[N][N], from[N], n, m, opt = INF;
  27. LD p, p1, dp[N][N];
  28. vector<int> ans;
  29.  
  30. int main()
  31. {
  32.     cin >> n >> m >> p >> p1;
  33.  
  34.     dp[0][0] = 1;
  35.     for (int i = 0; i < n; i++)
  36.         for (int j = 0; j <= i; j++) {
  37.             dp[i + 1][j + 1] += dp[i][j] * p1;
  38.             dp[i + 1][j] += dp[i][j] * (1 - p1);
  39.         }
  40.  
  41.     for (int i = 0; i < m; i += 2) {
  42.         cin >> a[i] >> b[i] >> l[i];
  43.         a[i + 1] = b[i];
  44.         b[i + 1] = a[i];
  45.         l[i + 1] = l[i];
  46.     }
  47.     m *= 2;
  48.  
  49.     for (int i = 1; i <= n; i++)
  50.         for (int j = 0; j <= n; j++)
  51.             dist[i][j] = INF;
  52.  
  53.     dist[1][0] = 0;        
  54.     for (int i = 0; i < n; i++) {
  55.         for (int j = 0; j < m; j++) {
  56.             if (b[j] == n)
  57.                     cerr << j << endl;
  58.  
  59.             if (dist[ b[j] ][i + 1] > dist[ a[j] ][i] + l[j]) {
  60.                 dist[ b[j] ][i + 1] = dist[ a[j] ][i] + l[j];
  61.                 from[ b[j] ] = a[j];
  62.                
  63.             }
  64.         }
  65.         if (dist[n][i + 1] != INF) {
  66.             LD rest = 1;
  67.             int ind = 0;
  68.             for (int t = i + 2; t >= 0; t--) {
  69.                 if (rest - dp[i + 2][t] > p - eps) {
  70.                     rest -= dp[i + 2][t];
  71.                 }
  72.                 else {
  73.                     ind = t;
  74.                     break;
  75.                 }
  76.             }
  77.             if (opt > dist[n][i + 1] + ind) {
  78.                 opt = dist[n][i + 1] + ind;
  79.                 int cur = n;
  80.                 ans.clear();
  81.                 while (cur != 1) {
  82.                     ans.pb(cur);
  83.                     cur = from[cur];
  84.                 }
  85.                 ans.pb(1);
  86.             }
  87.         }
  88.     }      
  89.  
  90.     cout << sz(ans) << endl;
  91.     for (int i = sz(ans) - 1; i >= 0; i--)
  92.         cout << ans[i] << " ";
  93.     cout << endl;
  94.    
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement