HDU6070 Lazy Running (最短路)

来源:互联网 发布:linux ifconfig 找不到 编辑:程序博客网 时间:2024/05/28 14:56

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;}

反思

因为有循环,所以才考虑同余类吗?