您的位置:首页 > 其它

HDU6070 Lazy Running (最短路)

2017-09-13 11:12 260 查看

HDU6070 Lazy Running (最短路)

题目描述

给一个四边形及其边长,求固定点出发回到固定点走过距离不小K的最短距离。

题目分析

关于证明,叉姐在这里有说。

代码

#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
typedef pair<ll, int> Pair;
const int maxn = 30100;
const ll INF = 0x3f3f3f3f3f3f3f3f;
struct Edge{
int u, v, c, nxt;
}e[16 * maxn];
priority_queue<Pair> q;
int dis[4], head[8 * maxn], e_cnt, done[8 * maxn];
ll d[8 * maxn];
void Add(int u, int v, int c){
int id = e_cnt++;
e[id].u = u;
e[id].v = v;
e[id].c = c;
e[id].nxt = head[u];
head[u] = id;
}
int main(){
int T; scanf("%d", &T);
while(T--){
ll K; scanf("%lld", &K);
for(int i = 0; i < 4; i++) scanf("%d", &dis[i]);
int m = 2 * min(dis[0], dis[1]), n = 4 * m;
for(int i = 0; i < n; i++)
head[i] = -1;
e_cnt = 0;
for(int k = 0; k < 4; k++)
for(int i = 0; i < m; i++){
Add(k * m + i, (k + 1) % 4 * m + (i + dis[k]) % m, dis[k]);
Add((k + 1) % 4 * m + i, k * m + (i + dis[k]) % m, dis[k]);
}
for(int i = 0; i < n; i++){
d[i] = i == m ? 0 : INF;
done[i] = false;
}
q.push(Pair(0ll, m));
while(!q.empty()){
int u = q.top().second; q.pop();
if(done[u]) continue;
done[u] = true;
for(int id = head[u]; id != -1; id = e[id].nxt){
int v = e[id].v;
if(d[v] > d[u] + e[id].c)
q.push(Pair(-(d[v] = d[u] + e[id].c), v));
}
}
ll ans = INF;
for(int i = m; i < 2 * m; i++){
if(d[i] < K) d[i] += ((K - d[i] - 1) / m + 1) * m;
ans = min(ans, d[i]);
}
printf("%lld\n", ans);
}
return 0;
}


反思

因为有循环,所以才考虑同余类吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: