【题目链接】 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;
}

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

  1. hdu 6071 Lazy Running 最短路建模

    Lazy Running Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) P ...

  2. HDU 6071 Lazy Running (最短路)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6071 题解 又是一道虐信心的智商题... 首先有一个辅助问题,这道题转化了一波之后就会化成这个问题: ...

  3. HDU 6071 - Lazy Running | 2017 Multi-University Training Contest 4

    /* HDU 6071 - Lazy Running [ 建模,最短路 ] | 2017 Multi-University Training Contest 4 题意: 四个点的环,给定相邻两点距离, ...

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

    Lazy Running Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)To ...

  5. HDU 6071 Lazy Running (同余最短路)

    Lazy Running Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)To ...

  6. HDU 6071 Lazy Running(很牛逼的最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=6071 题意: 1.2.3.4四个点依次形成一个环,现在有个人从2结点出发,每次可以往它相邻的两个结点跑,求最后回 ...

  7. 多校4 lazy running (最短路)

    lazy running(最短路) 题意: 一个环上有四个点,从点2出发回到起点,走过的距离不小于K的最短距离是多少 \(K <= 10^{18} 1 <= d <= 30000\) ...

  8. HDU 6071 同余最短路 spfa

    Lazy Running Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)To ...

  9. 2017 Multi-University Training Contest - Team 4 hdu6071 Lazy Running

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6071 题目: Lazy Running Time Limit: 2000/1000 MS (J ...

随机推荐

  1. 数组A - 财务管理

    Larry graduated this year and finally has a job. He's making a lot of money, but somehow never seems ...

  2. 转:国内优秀npm镜像推荐及使用

    原文:http://riny.net/2014/cnpm/ npm全称Node Package Manager,是node.js的模块依赖管理工具.由于npm的源在国外,所以国内用户使用起来各种不方便 ...

  3. LintCode之二叉树的最大节点

    分治问题,可以把整棵树看做是由一颗颗只有三个节点组成的小树,一颗树的构成是根节点.左子树.右子树,这样只需要从左子树找出一个最大的节点,从右子树找出一个最大的节点,然后与根节点三个取个最大的,就是最终 ...

  4. win10环境变量

    jdk8 JAVA_HOME D:\devsoft\jdk\jdk1.8 CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar pa ...

  5. webgote的例子(3)Sql注入(SearchPOST)

    Sql注入(Search/POST) (本章内容):post的方式进行注入 今天来讲一下sql注入的另一个例子(post) 上一个用的是get请求的方法将我们的参数传到服务器进行执行 上图中的标红是需 ...

  6. shell编程===执行shell脚本的四种方法

    使用vim创建一个shell文件,命名 hello.sh #!/bin/bash echo "hello shell !" 在linux中进行加载 chmod +x ./hello ...

  7. caffe Python API 之Solver定义

    from caffe.proto import caffe_pb2 s = caffe_pb2.SolverParameter() path='/home/xxx/data/' solver_file ...

  8. idea关于断点的补充

    黑背景版: 先编译好要调试的程序.1.设置断点

  9. 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...

  10. group by的运用

    select a.* from zeai_photo a inner join (select max(id) mid,userid from zeai_photo group by userid) ...