题意:

有个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;
}

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

  1. POJ3037 Skiing

    Skiing 题目大意: 给定一个M*N的网格,已知在每个网格中的点可以向上下左右四个方向移动一个单位,每个点都有一个高度值. 从每个点开始移动时存在一个速度值,从A点移动到B点,则此时B点的速度为& ...

  2. poj练习题的方法

    poj1010--邮票问题 DFSpoj1011--Sticks dfs + 剪枝poj1020--拼蛋糕poj1054--The Troublesome Frogpoj1062--昂贵的聘礼poj1 ...

  3. Skiing(最短路)

    poj——3037 Skiing Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4921   Accepted: 1315 ...

  4. POJ 3037 Skiing(如何使用SPFA求解二维最短路问题)

    题目链接: https://cn.vjudge.net/problem/POJ-3037 Bessie and the rest of Farmer John's cows are taking a ...

  5. 【转】最短路&差分约束题集

    转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...

  6. POJ - 3037 Skiing SPFA

    Skiing Bessie and the rest of Farmer John's cows are taking a trip this winter to go skiing. One day ...

  7. 最短路&查分约束

    [HDU] 1548 A strange lift 根蒂根基最短路(或bfs)★ 2544 最短路 根蒂根基最短路★ 3790 最短路径题目 根蒂根基最短路★ 2066 一小我的观光 根蒂根基最短路( ...

  8. bzoj1001--最大流转最短路

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...

  9. 【USACO 3.2】Sweet Butter(最短路)

    题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...

随机推荐

  1. nisi 脚本示例

    只是简单的copy文件和添加快捷方式,安装和卸载时对程序是否运行进行检测 ;-------------------------------- ;Include Modern UI !include & ...

  2. cocos2d-x3.0 windows 环境配置

    cocos2d-x3.0 windows 环境配置 参考Oo泡泡糖oO的CSDN博文 :http://blog.csdn.net/u010296979/article/details/24273393 ...

  3. vim cheat sheet

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzE1Mjg5NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  4. java类和对象之间的差

    java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...

  5. Lazy<T>延迟初始化

    延迟初始化:Lazy<T> 1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延 ...

  6. 活锁(livelock)

    活锁(livelock) 活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败. 活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于 ...

  7. 写你自己 android 多通道打包工具 可以包libs和.so文件

    android上传应用程序,需要区分各个信道. 通常更改配置文件中的一个通道id,假设有多个通道,手动更改并生成apk这将是非常麻烦的,及增加误差的概率. 在这个课堂上分享一个打包工具.也可在网上类似 ...

  8. TinyMCE实现简单的本地上传

    TinyMCE这个东西很多地方再用,不过我以前一直没用过,最近才接触,因为有一套现成的metro风格的皮肤,仅此而已,不过最终如何调用还是我得来实现.其他的都好说,网上的资料一大把一大把的,唯独这个本 ...

  9. ArrayList实现根据某属性大小相间排序

    Java本身提供了一个集合的帮助类java.util.Collections,提供了对集合操作一些方法,借助于此类提供的sort方法可以实现对List进行排序操作 import java.util.A ...

  10. SpringMVC传参

    @Controller @RequestMapping("/user") public UserController extends BaseController{ @InitBi ...