【最短路】【spfa】hdu6071 Lazy Running

给你一个4个点的环,问你从2号点出发, 再回到2号点,长度>=K的最短路是多少。环上的边长度不超过30000。

跑出来所有dis(2,j)以后,然后for一遍j,根据dis(2,j)+t*2*w>=K,解出来对于每个j而言最小的t,然后尝试更新答案即可。如果dis(2,j)已经大于等于K了,那直接用其尝试更新答案。

跟CDOJ1633很像。

#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
ll ans,K;
int W,T,a[4];
typedef pair<int,int> Point;
queue<Point>q;
bool inq[4][60010];
int dis[4][60010];
void spfa()
{
	memset(dis,0x7f,sizeof(dis));
	memset(inq,0,sizeof(inq));
	q.push(make_pair(1,0)); inq[1][0]=1; dis[1][0]=0;
	while(!q.empty()){
		Point U=q.front();
		Point V=make_pair((U.first+1)%4,(U.second+a[U.first])%(2*W));
		if(dis[V.first][V.second]>dis[U.first][U.second]+a[U.first]){
			dis[V.first][V.second]=dis[U.first][U.second]+a[U.first];
			if(!inq[V.first][V.second]){
				q.push(V);
				inq[V.first][V.second]=1;
			}
		}
		V=make_pair((U.first+3)%4,(U.second+a[(U.first+3)%4])%(2*W));
		if(dis[V.first][V.second]>dis[U.first][U.second]+a[(U.first+3)%4]){
			dis[V.first][V.second]=dis[U.first][U.second]+a[(U.first+3)%4];
			if(!inq[V.first][V.second]){
				q.push(V);
				inq[V.first][V.second]=1;
			}
		}
		q.pop();
		inq[U.first][U.second]=0;
	}
}
int main(){
//	freopen("1005.in","r",stdin);
//	freopen("1005.out","w",stdout);
	scanf("%d",&T);
	for(;T;--T){
		ans=9000000000000000000ll;
		scanf("%lld",&K);
		for(int i=0;i<4;++i){
			scanf("%d",&a[i]);
		}
		W=min(a[1],a[0]);
		spfa();
		for(int i=0;i<2*W;++i){
			if(dis[1][i]<2000000000){
//				printf("%d: (%d)\n",i,dis[1][i]);
				if(dis[1][i]<K){
					ans=min(ans,(ll)dis[1][i]+(ll)(2*W)*((K-(ll)dis[1][i])/(ll)(2*W)+(ll)((K-(ll)dis[1][i])%(ll)(2*W)!=0)));
				}
				else{
					ans=min(ans,(ll)dis[1][i]);
				}
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}
时间: 2024-10-26 23:34:59

【最短路】【spfa】hdu6071 Lazy Running的相关文章

HDU6071 Lazy Running

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6071 挺晚了,还是决定写一下题解~~~ 题意:给你四个点,组成一个圈,求从2出发再回到2的所有路径中大于K的最小值: 思路:其实跟前一篇大容量背包一样利用同余系最短路求: 可以这么理解,我对满足要求的所有路径分类,标准是模m的值为j(0=<j<m)的所有路径分到一组,而dis[i][j]表示满足从1到i模m为j的最小 路径,因为我们求的是最短路径,对于一组同余系,我记录最小的解即可,m是从1出来的两条

hdu-6071 Lazy Running

In HDU, you have to run along the campus for 24 times, or you will fail in PE. According to the rule, you must keep your speed, and your running distance should not be less than K meters. There are 4 checkpoints in the campus, indexed as p1,p2,p3 and

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

最短路 spfa算法

问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边. 输出格式 共n-1行,第i行表示1号点到i+1号点的最短路. 样例输入 3 31 2 -12 3 -13 1 2 样例输出 -1-2 数据规模与约定 对于10%的数据,n = 2,m = 2. 对于30%的数据,n <= 5,m <= 10. 对

TOJ--2674--最短路(spfa)

厌死了......排位 晋级赛 两连跪 ... 三角形 的那题还是 无限WA  ... 还有 明天又要早起... 先还是来看下这题吧 话说 好久没写 最短路了 --------- spfa 是我最喜欢的最短路版本 touch me 这题 其实相比其它的最短路 还是有个很让人看不懂的地方---让我纠结了很久 首先 它告诉了我们城市的编号 是从 1~1000 然后 又突然告诉我们 哪些城市和我们的出发地相邻 假如是 1 10 100...之类的 最后 告诉我们 你想取哪些城市 我就在想 起点呢!!!

洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

洛谷P1462 通往奥格瑞玛的道路二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点那么说明不符合要求 需要加大答案 时间复杂度 (log答案)* Ek 需要注意如果本来就不能到达 那么直接输出AFK 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define For(i,j,k) for(int i=j;i<=k;i++) 4 using

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