HDU6071-最短路
http://acm.hdu.edu.cn/showproblem.php?pid=6071
四个点围成一个环,相邻两点之间存在路径,问从2号点出发最后再次回到二号点,在路程大于等于K的情况下的最小路程量。
我们令m=min(d1,d2)*2,可以想做是回到2号点之后再重复的走若干个m后的路程。(当然m也可以是max(d1,d2)*2,因为只要和2相邻即可)。
f[i][j]表示从2出发达到i之后,走过路程f[i][j]%m=j的最小路程,跑一遍dij,最后统计结果如果不足k就加上m补足。
这样之所以是正确的在于考虑了所有的情况,对于同一个模m剩余系里面的路程他们之间的差值一定是m的倍数,所以选出一个最小的如果不足k用m补足
相当于还原到另一个路程上了,也能找到最优解。
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
#include<bits/stdc++.h>
#define LL long long
using namespace std;
#define LL long long
struct Edge
{
LL u,w;
};
struct node
{
LL u,w;
bool operator<(const node&chs)const{
return w>chs.w;
}
};
LL f[][];
vector<Edge> g[];
void dij(LL m)
{
memset(f,-,sizeof(f));
f[][]=;
priority_queue<node>q;
q.push(node{,});
while(!q.empty()){
int u=q.top().u,
w=q.top().w;
q.pop();
for(int i=;i<g[u].size();++i){
if(w+g[u][i].w<f[g[u][i].u][(w+g[u][i].w)%m]||f[g[u][i].u][(w+g[u][i].w)%m]==-){
f[g[u][i].u][(w+g[u][i].w)%m]=w+g[u][i].w;
q.push(node{g[u][i].u,f[g[u][i].u][(w+g[u][i].w)%m]});
}
}
}
}
int main()
{
LL n,m,i,j,k,d[],t;
cin>>t;
while(t--){
cin>>k;
for(i=;i<;++i)cin>>d[i],g[i].clear();
g[].push_back(Edge{,d[]});
g[].push_back(Edge{,d[]}); g[].push_back(Edge{,d[]});
g[].push_back(Edge{,d[]}); g[].push_back(Edge{,d[]});
g[].push_back(Edge{,d[]}); g[].push_back(Edge{,d[]});
g[].push_back(Edge{,d[]}); m=min(d[],d[])*;
dij(m);
LL ans=1e18;
for(i=;i<m;++i){
if(f[][i]==-) continue;
if(f[][i]>=k) ans=min(ans,f[][i]);
else{ ans=min(ans,f[][i]+
(k-f[][i])/m*m+((k-f[][i])%m>)*m);
}
}
cout<<ans<<endl;
}
return ;
}
HDU6071-最短路的更多相关文章
- hdu6071[最短路+解不等式] 2017多校4
求出所有,从2走到x所需的花费在对 t = 2*min(d1,2, d2,3) 模运算下, 所有剩余系的最短路即可(把一个点拆成 t 个点, 每个点代表一种剩余系), 知道了所有剩余系就可以凑出答案 ...
- hdu6071(最短路)
hdu6071 题意 四个点连接形成一个环,给出相邻两个点的距离,求从点 \(2\) 出发再回到 \(2\) 的路程大于等于 \(K\) 的最小值. 分析 首先我们让 \(w=min(d12, d23 ...
- 【最短路】【spfa】hdu6071 Lazy Running
给你一个4个点的环,问你从2号点出发, 再回到2号点,长度>=K的最短路是多少.环上的边长度不超过30000. 跑出来所有dis(2,j)以后,然后for一遍j,根据dis(2,j)+t*2*w ...
- bzoj1001--最大流转最短路
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...
- 【USACO 3.2】Sweet Butter(最短路)
题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...
- Sicily 1031: Campus (最短路)
这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...
- 最短路(Floyd)
关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...
- bzoj1266最短路+最小割
本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...
- HDU2433 BFS最短路
Travel Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 最短路(代码来源于kuangbin和百度)
最短路 最短路有多种算法,常见的有一下几种:Dijstra.Floyd.Bellman-Ford,其中Dijstra和Bellman-Ford还有优化:Dijstra可以用优先队列(或者堆)优化,Be ...
随机推荐
- Java 运行环境介绍
Java 语言特点: 跨平台性: 一次编译,到处运行.即不受操作系统限制,编译一次,可以在多个平台运行.而这个优势得益于 JVM(Java Virtual Machine, 即Java 虚拟机). 两 ...
- Java 之反射机制
java 语言的反射机制 - 在运行状态中,对于任意一个类 (class 文件),都能够知道这个类的所有属性和方法; - 能动态获取类中的信息,也可以理解为对类(字节码文件)的解剖 描述字节码文件的类 ...
- QStorageInfo获取磁盘信息(非常详细)
QStorageInfo类提供了系统当前挂载的存储和驱动器的相关信息,包括它们的空间,挂载点,标签名,文件系统名. 一般,我们可以使用特定的文件或目录来创建一个QStorageInfo类的对象,也可以 ...
- List、Map、Set三个接口,存取元素时,各有什么特点?
List与Set都是单列元素的集合,它们有一个功共同的父接口Collection. Set里面不允许有重复的元素, 存元素:add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法 ...
- OVN实战---《An Introduction to OVN Routing》翻译
Overview 在前面一篇文章的基础上,现在我将通过OVN创建一个基础的三层网络.创建的最终结果将是一对logical switches通过一个logical router相连.另外,该路由器会通过 ...
- is和==的区别以及编码、解码
一.is和==的区别 1,id( ) id( )是python的一个内置函数,通过id( )我们可以查看到一个变量表的值在内存中的地址: s1 = 2 print(id(s1)) # 15143680 ...
- CentOS7.1 KVM虚拟化之linux虚拟机安装(2)
一.上传ISO文件到/data/iso下 这里使用CentOS-5.5-i386-bin-DVD.iso 二.安装CentOS5.5 CentOS7.1 安装KVM虚拟机默认磁盘格式为qcow2(推荐 ...
- 003-mysql查询表的数据大小
在需要备份数据库里面的数据时,我们需要知道数据库占用了多少磁盘大小,可以通过一些sql语句查询到整个数据库的容量,也可以单独查看表所占容量. 1.查看数据库表结构大小,要查询表所占的容量,就是把表的数 ...
- 002-docker安装-mac上安装docker,17.06在CentOS7 64位机器上安装
一.mac上安装docker 1.下载 通过这个链接下载:https://download.docker.com/mac/stable/Docker.dmg 2.安装 将 Moby 的鲸鱼图标拖拽到 ...
- qt下通过socket传送中文
zz 1.在main函数里我之前就加了一句QTextCodec::setCodecForTr( QTextCodec::codecForLocale() ); 现在再加一句QTextCodec::se ...