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 ...
随机推荐
- Ionic的下拉框在手机上点击无效
最近在维护ionic+angular的项目,在浏览器使用下拉框的时候调试的时候,一切正常. 但是在手机上测试的时候,遇到这个问题. 我使用的版本是ionic1.3.1,不知道新版本有没有解决这个bug ...
- Python简单实现邮件群发
Python简单实现邮件群发 import smtplib from email.mime.text import MIMEText from email.utils import formatadd ...
- CNN学习笔记:池化层
CNN学习笔记:池化层 池化 池化(Pooling)是卷积神经网络中另一个重要的概念,它实际上是一种形式的降采样.有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见 ...
- Web安全学习笔记之HTTP协议
HTTP是一个应用层协议,主要用于Web开发,通常由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接.HTTP服务器则在那个端口监听客户端的请求.一旦收到请求,服务器 ...
- 大牛是怎么思考设计MySQL优化方案的?
在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已. 图-MySQL查询过程 一.优化的哲学 ...
- 一键配置IP地址脚本
#/bin/bash NETPWD='/etc/sysconfig/network-scripts/' read -p "please enten net num(1,2,3,4) : &q ...
- System.load 和 System.loadLibrary详解
System.load 和 System.loadLibrary详解 1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件.在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI ...
- JAVA基础补漏--继承
子类的对象在创建时,首先调用父类的构造函数,再调用子类自己的构造函数. 子类的构造函数中,有一个默认的super(),为一个无参调用,这个不显示,但会被首先调用,所有才会有父类构造函数被调用的情况. ...
- Navicat Premium 10/12——破解激活
Navicat Premium 12官方Windows64位百度云 链接:https://pan.baidu.com/s/1hGmDljszQsUoi194CYdfmA 密码:1xff 官方下载链接 ...
- Oracle常见的几种登录方式
1.运行SQLPLUS工具 C:\Users\csb>sqlplus(回车) (输入账户)system(回车) (输入密码) (回车) 2.直接进入SQLPLUS命令提示符,无用户的登陆 C:\ ...