Guest User

Untitled

a guest
May 23rd, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.31 KB | None | 0 0
  1. // by tmt514
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <cstdio>
  5. #include <cstdlib>
  6. #include <cstring>
  7. #include <iostream>
  8. #include <string>
  9. #include <vector>
  10. #define SZ(x) ((int)(x).size())
  11. #define FOR(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it)
  12. using namespace std;
  13. typedef long long LL;
  14.  
  15. const int N = 5005;
  16. const int M = 100005;
  17. int s[M], t[M], c[M], p[M], q[M];
  18. #include <iomanip>
  19. #include <queue>
  20. #include <cassert>
  21. //#define NDEBUG
  22. //int Q[5000005], qb, qe;
  23. #include <queue>
  24. priority_queue<pair<double, int>> PQ;
  25. void solve() {
  26. int n, m;
  27. vector<int> a[N];
  28. const double INF = 1e9;
  29. double d[N];
  30. scanf("%d%d", &n, &m);
  31. assert(m <= 100000);
  32. for(int i=0;i<m;i++) {
  33. scanf("%d%d%d%d%d", &s[i], &t[i], &c[i], &p[i], &q[i]);
  34. assert(1 <= s[i] && s[i] <= n);
  35. assert(1 <= t[i] && t[i] <= n);
  36. assert(1 <= c[i] && c[i] <= 100);
  37. assert(1 <= p[i] && p[i] <= 100);
  38. assert(1 <= q[i] && q[i] <= 100);
  39. assert(s[i] != t[i]);
  40. a[s[i]].push_back(i);
  41. a[t[i]].push_back(i);
  42. }
  43. for(int x=1;x<=n;x++) {
  44. d[x] = INF;
  45. for(auto i: a[x]) {
  46. int pmiss = 100 - (x == s[i]? p[i]: q[i]);
  47. int qmiss = 100 - (x == s[i]? q[i]: p[i]);
  48. d[x] = min(d[x], c[i] * (10000 + 100 * pmiss) / (double)(10000 - pmiss * qmiss));
  49. }
  50. }
  51.  
  52. bool mark[N] = {};
  53. //qb = qe = 0;
  54. for(int x=1;x<=n;x++) { mark[x] = 1; PQ.push({ -d[x], x }); }
  55. while (!PQ.empty()) {
  56. auto pp = PQ.top();
  57. PQ.pop();
  58. int x = pp.second;
  59. //int x = Q[qb++];
  60. mark[x] = false;
  61. for(auto i : a[x]) {
  62. int y = (x==s[i]? t[i]: s[i]);
  63. int pmiss = 100 - (x == s[i]? p[i]: q[i]);
  64. double v = c[i] + pmiss / 100.0 * d[y];
  65. if (d[x] > v) d[x] = v;
  66. }
  67. for(auto i : a[x]) {
  68. int y = (x==s[i]? t[i]: s[i]);
  69. int qmiss = 100 - (x == s[i]? q[i]: p[i]);
  70. double v = c[i] + qmiss / 100.0 * d[x];
  71. if (d[y] > v) {
  72. d[y] = v;
  73. if (mark[y] == false) {
  74. mark[y] = true;
  75. PQ.push({ -d[y], y });
  76. //Q[qe++] = y;
  77. }
  78. }
  79. }
  80. }
  81.  
  82. for(int i=0;i<m;i++) {
  83. int x = s[i], y = t[i];
  84. //fprintf(stderr, "x=%d (%.6Lf), y=%d (%.6Lf), (c=%d, p=%d, q=%d)\n", x, d[x], y, d[y], c[i], p[i], q[i]);
  85. assert(d[x] <= c[i] + (100-p[i]) / 100.0 * d[y]);
  86. assert(d[y] <= c[i] + (100-q[i]) / 100.0 * d[x]);
  87. }
  88.  
  89. cout << fixed << setprecision(6) << d[1] << endl;
  90. }
  91.  
  92. int main(void) {
  93. int T;
  94. srand(0);
  95. scanf("%d", &T);
  96. while(T--) solve();
  97. return 0;
  98. }
Add Comment
Please, Sign In to add comment