生活随笔
收集整理的這篇文章主要介紹了
HDU-6290 奢侈的旅行 2018女赛 Dijkstra堆优化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 又因為cost=log2?((level+ai)/level)cost=log2*((level+a_i)/level)cost=log2?((level+ai?)/level),cost會帶著log2,這個log2很可能導致答案有精度誤差,因此,等式兩邊等式做冪,變形為2cost=1+ai/level2^{cost}=1+a_i/level2cost=1+ai?/level
- 因為inf的原因一直wa
#include <iostream>
#include <cstring>
#include <queue>
#include <math.h>using namespace std
;typedef long long ll
;
typedef pair
<ll
,int> pii
;const int N
= 1e5 + 10;
const ll inf
= 1e17 + 7;struct Edge
{int v
, a
, b
;
};vector
<Edge
> G
[N
];
int n
, m
;
ll dist
[N
];
bool st
[N
];void dijkstra()
{for (int i
= 1; i
<= n
; i
++ ) dist
[i
] = inf
;memset(st
, 0, sizeof st
);dist
[1] = 1;priority_queue
<pii
, vector
<pii
>, greater
<pii
>> heap
;heap
.push({1, 1});while (heap
.size()){auto t
= heap
.top();heap
.pop();int ver
= t
.second
;ll distance
= t
.first
;if (st
[ver
]) continue;st
[ver
] = true;for (int i
= 0; i
< G
[ver
].size(); i
++ ){int v
= G
[ver
][i
].v
, a
= G
[ver
][i
].a
, b
= G
[ver
][i
].b
;if (log2((dist
[ver
] * 1.0 + a
) / dist
[ver
]) < b
) continue;if (dist
[v
] > dist
[ver
] + a
){dist
[v
] = dist
[ver
] + a
;heap
.push({dist
[v
], v
});}}}
}int main()
{int _
;scanf("%d", &_
);while (_
-- ){scanf("%d%d", &n
, &m
);for (int i
= 1; i
<= n
; i
++ ) G
[i
].clear();while (m
-- ){int u
, v
, a
, b
;scanf("%d%d%d%d", &u
, &v
, &a
, &b
);G
[u
].push_back({v
, a
, b
});}dijkstra();if (dist
[n
] == inf
) puts("-1");else printf("%d\n", (int)(log2(dist
[n
])));}return 0;
}
#include <iostream>
#include <cstring>
#include <queue>
#include <math.h>using namespace std
;typedef long long ll
;
typedef pair
<ll
, int> pii
;const int N
= 1e5 + 10, M
= 2e5 + 10;
const ll inf
= 1e17 + 7;int h
[N
], e
[M
], ne
[M
], a
[M
], b
[M
], idx
;
ll dist
[N
];
bool st
[N
];
int n
, m
;void add(int u
, int v
, int x
, int y
)
{e
[idx
] = v
, a
[idx
] = x
, b
[idx
] = y
, ne
[idx
] = h
[u
] ++ , h
[u
] = idx
++ ;
}void dijkstra()
{
for (int i
= 1; i
<= n
; i
++ ) dist
[i
] = inf
, st
[i
] = 0;dist
[1] = 1;priority_queue
<pii
, vector
<pii
>, greater
<pii
>> heap
;heap
.push({1, 1});while (heap
.size()){auto t
= heap
.top();heap
.pop();int ver
= t
.second
;ll distance
= t
.first
;if (st
[ver
]) continue;st
[ver
] = true;for (int i
= h
[ver
]; ~i
; i
= ne
[i
]){int j
= e
[i
];if (log2((dist
[ver
] * 1.0 + a
[i
]) / dist
[ver
]) < b
[i
]) continue;if (dist
[j
] > dist
[ver
] + a
[i
]){dist
[j
] = dist
[ver
] + a
[i
];heap
.push({dist
[j
], j
});}}}
}int main()
{int _
;scanf("%d", &_
);while (_
-- ){scanf("%d%d", &n
, &m
);memset(h
, -1, sizeof h
);idx
= 0;while (m
-- ){int u
, v
, x
, y
;scanf("%d%d%d%d", &u
, &v
, &x
, &y
);add(u
, v
, x
, y
);}dijkstra();if (dist
[n
] == inf
) printf("-1\n");else printf("%d\n", (int)(log2(dist
[n
])));}return 0;
}
總結
以上是生活随笔為你收集整理的HDU-6290 奢侈的旅行 2018女赛 Dijkstra堆优化的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。