【POJ3037】Skiing 最短路

题意:

有个n*m的滑雪场,bessie要从(1,1)滑到(n,m),问最小时间。

起始有一个速度v,然后每从一个点A到一个点B(只能上下左右走,每次一格),速度就会乘上2^(权值A-权值B)。

然后每次移动的耗时是当前速度的倒数。

题解:

分析一下就能发现,乘乘除除后,从一个点出发时的速度都是固定的,即与从起点直接到该点的速度是一致的,那么我们就可以建成一个边权固定的无向图了,当然,A->B和B->A的距离基本不可能相等。

这道题很坑,首先就是数据范围很大,需要#define inf 999999999999.99

然后就是错了的话注意C++和G++都交交,然后各种输出.2f和.2lf啊神马的。

然后TLE了不妨多写个几行代码加个pq优化。

就这些,其实我还TLE这呢,实在是拍不出来错误,受不了了,交了个网上代码,但是我仍然要把我的代码贴一份,以助各位理解,毕竟代码风格不错。

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N  105
#define NN 10100
#define M 80000
#define inf 999999999999.99
#define eps 1e-6
using namespace std;
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
struct KSD
{
	int v,next;
	double len;
}e[M];
int head[NN],cnt;
void add(int u,int v,double len)
{
	cnt++;
	e[cnt].v=v;
	e[cnt].len=len;
	e[cnt].next=head[u];
	head[u]=cnt;
}
int id[N][N],num;
int n,m;
int map[N][N];
double speed[N][N],p;
int power(int x,int p)
{
	int ret=1;
	while(p)
	{
		if(p&1)ret*=x;
		x*=x;
		p>>=1;
	}
	return ret;
}
double dist[NN];
bool in[NN];
struct Lux
{
	double f;
	int v;
	Lux(double _f,int _v):f(_f),v(_v){}
	Lux(){}
	bool operator < (const Lux &a)const
	{return f<a.f;}
};
double spfa(int s,int t)
{
	int i,u,v;
	priority_queue<Lux>q;
	for(i=s;i<=t;i++)dist[i]=inf;
	dist[s]=0;
	in[s]=1;
	q.push(Lux(0,s));
	while(!q.empty())
	{
		Lux U=q.top();
		q.pop();
		u=U.v;
		in[u]=0;
		for(i=head[u];i;i=e[i].next)
		{
			v=e[i].v;
			if(dist[v]>dist[u]+e[i].len+eps)
			{
				dist[v]=dist[u]+e[i].len;
				if(!in[v])
				{
					in[v]=1;
					q.push(Lux(dist[v],v));
				}
			}
		}
	}
	return dist[t];
}
int main()
{
//	freopen("test.in","r",stdin);
	int i,j,k;
	int a,b,c;
	int x,y,nid;
	scanf("%lf%d%d",&p,&n,&m);p=1.0/p;
	for(i=1;i<=n;i++)for(j=1;j<=m;j++)
	{
		id[i][j]=++num;
		scanf("%d",&map[i][j]);
		if(map[i][j]>=map[1][1])speed[i][j]=p*power(2,map[i][j]-map[1][1]);
		else speed[i][j]=p/(double)power(2,map[1][1]-map[i][j]);
	}
	for(i=1;i<=n;i++)for(j=1;j<=m;j++)
	{
		nid=id[i][j];
		for(k=0;k<4;k++)
		{
			x=i+dx[k];
			y=j+dy[k];
			if(!id[x][y])continue;
			add(nid,id[x][y],speed[i][j]);
		}
	}
	printf("%.2f\n",spfa(1,n*m));
	return 0;
}

复制去Google翻译翻译结果

时间: 2024-12-17 18:53:13

【POJ3037】Skiing 最短路的相关文章

poj练习题的方法

poj1010--邮票问题 DFSpoj1011--Sticks dfs + 剪枝poj1020--拼蛋糕poj1054--The Troublesome Frogpoj1062--昂贵的聘礼poj1077--Eightpoj1084--Square Destroyerpoj1085--Triangle War(博弈,極大極小搜索+alpha_beta剪枝)poj1088--滑雪poj1129--Channel Allocation 着色问题 dfspoj1154--letters (dfs)p

POJ 搜索题集

poj1010--邮票问题 DFS poj1011--Sticks dfs + 剪枝 poj1020--拼蛋糕 poj1054--The Troublesome Frog poj1062--昂贵的聘礼 poj1077--Eight poj1084--Square Destroyer poj1085--Triangle War(博弈,極大極小搜索+alpha_beta剪枝) poj1088--滑雪 poj1129--Channel Allocation 着色问题 dfs poj1154--lett

Skiing(最短路)

poj——3037 Skiing Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4921   Accepted: 1315   Special Judge Description Bessie and the rest of Farmer John's cows are taking a trip this winter to go skiing. One day Bessie finds herself at the

Skiing SPFA

Skiing Bessie and the rest of Farmer John's cows are taking a trip this winter to go skiing. One day Bessie finds herself at the top left corner of an R (1 <= R <= 100) by C (1 <= C <= 100) grid of elevations E (-25 <= E <= 25). In order

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

//转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX 105 int lim, n; int p[M

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h