HDU 6071 Lazy Running(最短路)

【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=6071

【题目大意】

  给出四个点1,2,3,4,1和2,2和3,3和4,4和1 之间有路相连,
  现在从2点出发,最后回到2点,要求路径大于等于K,问路径长度最短是多少

【题解】

  取一条与2相连的权值最小的边w。
  若存在一条从起点到终点的长度为k的路径,
  那么必然存在一条长度为k+2w的路径,只要一开始在那条边上往返走就好了。
  设dij表示从起点到i,路径长度模2w为j时,路径长度的最小值。
  用最短路算法求出所有dij,然后检查d[n][k%2w]是否不超过k即可。
  对于求大于等于k的最小解,只要枚举W解不等式即可。

【代码】

#include <cstdio>
#include <cstring>
#include <queue>
#include <utility>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N=1000010;
const LL INF=0x3f3f3f3f3f3f3f3f;
typedef pair<LL,int>seg;
priority_queue<seg,vector<seg>,greater<seg> >q;
int head[N],u[N],v[N],w[N],nxt[N],n,m,ed=0;
LL d[5][N],W;
void add(int a,int b,int c){
    u[++ed]=a,v[ed]=b,w[ed]=c;
    nxt[ed]=head[u[ed]]; head[u[ed]]=ed;
}
void Dijkstra(int src){
    for(int i=0;i<=n;i++)for(int j=0;j<W;j++)d[i][j]=INF;
    q.push(make_pair(0,src));
    while(!q.empty()){
        seg now=q.top(); q.pop();
        LL _w=now.first;
        int x=now.second;
        if(_w>d[x][_w%W])continue;
        for(int e=head[x];e!=-1;e=nxt[e]){
            LL nw=_w+w[e];
            if(d[v[e]][nw%W]>nw){
                d[v[e]][nw%W]=nw;
                q.push(make_pair(nw,v[e]));
            }
        }
    }
}
int T;
LL k,d1,d2,d3,d4;
int main(){
    scanf("%d",&T); n=4;
    while(T--){
        LL ans=INF;
        memset(head,-1,sizeof(head));ed=0;
        scanf("%lld%lld%lld%lld%lld",&k,&d1,&d2,&d3,&d4);
        if(d2<d1)W=2*d2; else W=2*d1;
        add(3,4,d3); add(4,3,d3);
        add(2,1,d1); add(1,2,d1);
        add(2,3,d2); add(3,2,d2);
        add(1,4,d4); add(4,1,d4);
        Dijkstra(2);
        for(int i=0;i<W;i++){
            if(k<=d[2][i])ans=min(ans,d[2][i]);
            else ans=min(ans,d[2][i]+((k-d[2][i]+W-1)/W)*W);
        }printf("%lld\n",ans);
    }return 0;
}
时间: 2024-10-13 16:14:48

HDU 6071 Lazy Running(最短路)的相关文章

hdu 6071 Lazy Running(同余最短路)

题目链接:hdu 6071 Lazy Running 题意: 给你4个点,每两个相邻点有一个距离,现在让你在这四个点来回跑步,从2开始,最后回到2,问你找一个距离ans,ans>=k,问最小的ans是多少. 题解: Claris的官方题解: 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=(a);i<=(b);++i) 3 using namespace std; 4 using ll=long long; 5 6 co

HDU 6071 Lazy Running (同余最短路)

Lazy Running Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 101    Accepted Submission(s): 40 Problem Description In HDU, you have to run along the campus for 24 times, or you will fail in PE

HDU 6071 Lazy Running (同余最短路 dij)

Lazy Running Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 1384    Accepted Submission(s): 597 Problem Description In HDU, you have to run along the campus for 24 times, or you will fail in

HDU 6071 同余最短路 spfa

Lazy Running Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 657    Accepted Submission(s): 284 Problem Description In HDU, you have to run along the campus for 24 times, or you will fail in P

HDU 3832 Earth Hour (最短路)

Earth Hour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)Total Submission(s): 1518    Accepted Submission(s): 607 Problem Description Earth Hour is an annual international event created by the WWF (World Wide Fun

HDU 1491 社交网络(最短路计数)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1491 题意:给出一个联通的无向图,边有权值.定义I(v)如下,计算每个点的I值. 思路:(1)最简单的就是那个floyd了...g[i][j]记录最短路长度,f[i][j]记录个数,不多说了: (2)下面说说我自己想出来的算法..枚举s和t,计算每个点到s和t的最短路..然后建立最短路树..之后求s到t的最短路个数..然后枚举删掉某个点再求最短路个数,则差值即为通过删掉点的最短路数目.

HDU 4856 Tunnels (最短路+状压DP)

题意:给你N*N的网格,'.'表示可以走,'#'表示不能走,m条管道,每条管道有起点和终点坐标, Bob每次可以走到相邻的网格花费1s,问Bob走完m条管道要花多少时间:Bob在管道内不计算时间 即计算Bob从管道 i 的出口走到管道 j 的入口的时间Dis(e[i],s[j])的最小和,起点可以任意: 思路:看了题解说是状态压缩DP然后深入理解了下. 首先算出d[e[i]][s[j]]的最短距离,不能到达为-1: dp[i][j] : 表示以 j 为起点状态为 i 的最小值.其中 i 是用十进

HDU 2833 WuKong(floyd最短路)

题目地址:HDU 2833 这题想到了最后是通过dis[s][t]==dis[s][i]+dis[i][j]+dis[j][t]的思路来判定是否属于最短路的一条..但是没想到可以用floyd来找最短路中的点数...最短路还是太渣了..好多性质都不会利用.. 这题的思路就是通过floyd对每两个点之间的最短路条数进行计数,然后通过上面的公式(对两条路线均要判定,都符合才说明都可以走),再找最短路中的最大点数. 代码如下: #include <iostream> #include <stdi

hdu 2962 Trucking (二分+最短路Spfa)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 Trucking Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1763    Accepted Submission(s): 618 Problem Description A certain local trucking co