POJ - 3037-Skiing(邻接表+Dijkstra)
Bessie starts out travelling at a initial speed V (1 <= V <= 1,000,000). She has discovered a remarkable relationship between her speed and her elevation change. When Bessie moves from a location of height A to an adjacent location of eight B, her speed is multiplied by the number 2^(A-B). The time it takes Bessie to travel from a location to an adjacent location is the reciprocal of her speed when she is at the first location.
Find the both smallest amount of time it will take Bessie to join her cow friends.
Input
* Lines 2..R+1: C integers representing the elevation E of the corresponding location on the grid.
Output
Sample Input
1 3 3
1 5 3
6 3 5
2 4 3
Sample Output
29.00
Hint
Start at 1,1 time 0 speed 1
East to 1,2 time 1 speed 1/16
South to 2,2 time 17 speed 1/4
South to 3,2 time 21 speed 1/8
East to 3,3 time 29 speed 1/4
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>
#define Inf 0x3f3f3f3f const int maxn=1e5+;
typedef long long ll;
using namespace std;
ll ksm(ll x,ll y)
{
ll ans=;
while(y)
{
if(y&)
{
ans=ans*x;
}
x*=x;
y>>=;
}
return ans;
}
struct node
{
int to;
double w;
bool friend operator < (node x,node y)
{
return x.w>y.w;
}
};
int Map[]; vector<node>vec[];
double dis[];
int vis[];
int V,R,C;
int dir[][]={{,},{,-},{-,},{,}};
bool check(int x,int y)
{
if(x>=&&x<=R&&y>=&&y<=C)
{
return true;
}
else
{
return false;
}
}
void init()
{
for(int t=;t<=R*C;t++)
{
dis[t]=;
}
} void Dijkstra(int s)
{
node st;
st.to=s;
st.w=;
priority_queue<node>q;
q.push(st);
dis[s]=;
while(!q.empty())
{
node now=q.top();
q.pop();
if(vis[now.to])continue;
vis[now.to]=; int len=vec[now.to].size();
for(int t=;t<len;t++)
{
node tto=vec[now.to][t]; if(vis[tto.to]==&&tto.w+dis[now.to]<dis[tto.to])
{
tto.w=tto.w+dis[now.to];
dis[tto.to]=tto.w;
q.push(tto);
}
}
}
} int main()
{
// std::ios::sync_with_stdio(false);
scanf("%d%d%d",&V,&R,&C);
init();
for(int t=;t<=R;t++)
{
for(int j=;j<=C;j++)
{
scanf("%d",&Map[(t-)*C+j]);
}
}
for(int t=;t<=R;t++)
{
for(int j=;j<=C;j++)
{
for(int k=;k<;k++)
{
int xx=t+dir[k][];
int yy=j+dir[k][];
if(check(xx,yy))
{
node s;
s.to=(xx-)*C+yy;
s.w=1.0/V*ksm(,Map[(t-)*C+j]-Map[]);
vec[(t-)*C+j].push_back(s);
}
}
}
}
Dijkstra();
printf("%.2f\n",dis[R*C]); return ;
} AC的是邻接表的
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath> const int maxn=1e4+;
typedef long long ll;
using namespace std; struct edge
{
int u,v;
double w;
int next;
}edge[maxn*]; struct node
{
int pos;
double w;
node(int x,double y)
{
pos=x;
w=y;
}
bool friend operator <(node x,node y)
{
return x.w>y.w;
}
};
int n,m,s,x,y,z,tot = ,V;
bool check(int x,int y)
{
if(x>=&&x<=n&&y>=&&y<=m)
{
return true;
}
else
{
return false;
}
}
int head[];
double d[];
int vis[];
int a[];
int dist[][] = {{-,},{,-},{,},{,}}; void add(int u,int v,double w)
{
edge[++tot].u=u;
edge[tot].v=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot;
return ;
} void Dijkstra(int s)
{
priority_queue<node>q;
d[s]=;
q.push(node(s,));
while(!q.empty())
{
node now=q.top();
q.pop();
//cout<<now.pos<<endl;
if(vis[now.pos])continue;
vis[now.pos]=; for(int i=head[now.pos];i!=-;i=edge[i].next)
{
int ne=edge[i].v;
double ww=edge[i].w;
if(d[now.pos]+ww<d[ne])
{
d[ne]=d[now.pos]+ww;
q.push(node(ne,d[ne]));
}
}
}
return ;
}
int main()
{
scanf("%d%d%d",&V,&n,&m);
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis)); for(int t=;t<=n*m;t++)
{
d[t]=;
}
for(int i = ;i <= n; ++i)
for(int j = ;j <= m; ++j)
scanf("%d",&a[(i-)*m+j]);
for(int i = ;i <= n; ++i)
for(int j = ;j <= m; ++j)
for(int k = ;k < ; ++k)
{
int x = i + dist[k][];
int y = j + dist[k][];
if(check(x,y))
{
double v = 1.0 / V * pow(2.0 , a[(i-)*m+j] - a[]);
add((i-)*m+j,(x-)*m+y,v);
}
}
Dijkstra();
printf("%.2f\n",d[n * m]);
return ;
}
POJ - 3037-Skiing(邻接表+Dijkstra)的更多相关文章
- POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化
昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...
- poj 1511(SPFA+邻接表)
题目链接:http://poj.org/problem?id=1511 思路:题目意思很简单就是要求源点到各点的最短路之和,然后再求各点到源点的最短路之和,其实就是建两个图就ok了,其中一个建反图.1 ...
- USACO 2008 January Silver Telephone Lines /// 二分最短路 邻接表dijkstra oj22924
题目大意: 一共有N (1 ≤ N ≤ 1,000)个电线杆,有P P (1 ≤ P ≤ 10,000)对电线杆是可以连接的, 用几条线连接在一起的电线杆之间都可相互通信,现在想要使得电线杆1和电线杆 ...
- POJ - 3255 SPFA+邻接表求次短路径
题意:给出m条边 , n个顶点,u [ i ]到v [ i ] 的距离w [ i ],求除了最短路的那条最短的边的长度. 思路:之前有做过相似的题,使用迪杰斯特拉算法求单源最短路径,并且记录路径,枚举 ...
- POJ 3037 Skiing(Dijkstra)
Skiing Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4668 Accepted: 1242 Special ...
- POJ 3037 Skiing(如何使用SPFA求解二维最短路问题)
题目链接: https://cn.vjudge.net/problem/POJ-3037 Bessie and the rest of Farmer John's cows are taking a ...
- 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 ...
- Poj(2679),SPFA,邻接表(主流写法)
题目链接:http://poj.org/problem?id=3268 题意: 有编号为1-N的牛,它们之间存在一些单向的路径.给定一头牛的编号,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求 ...
- hdu1839之二分+邻接表+Dijkstra+队列优化
Delay Constrained Maximum Capacity Path Time Limit: 10000/10000 MS (Java/Others) Memory Limit: 65 ...
随机推荐
- 每日一道 LeetCode (6):有效的括号
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 调用thrift出现No handlers could be found for logger "thrift.transport.TSocket"
1.问题 使用thrift版本为0.10,在0.8没有这个问题 其中ncTAgent是代码中封装的thrift接口的结构,在thrift服务端没有启动的时候,应该拋错为连接不到.但是拋错的堆栈输出之前 ...
- 用Python做一个简单的翻译工具
编程本身是跟年龄无关的一件事,不论你现在是十四五岁,还是四五十岁,如果你热爱它,并且愿意持续投入其中,必定会有所收获. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过 ...
- springboot多环境部署(profile多环境支持)
springboot多环境部署(profile多环境支持) 背景 项目开发过程中会有开发环境(dev),测试环境(test)和生产环境(prod),不同的环境需要配置不同的配置,profile提供 ...
- 精确到小数点后n位的两种方法
引言:大家在写程序中多多少少会遇到这个问题,特别对一些初学者会出现这个问题,做个ACM竞赛的同学肯定都会用C语言的printf格式控制输出,但是习惯于用C++的同学也不是一点办法都没有啊,这篇blog ...
- 一个@Transaction哪里来这么多坑?
前言 在之前的文章中已经对Spring中的事务做了详细的分析了,这篇文章我们来聊一聊平常工作时使用事务可能出现的一些问题(本文主要针对使用@Transactional进行事务管理的方式进行讨论)以及对 ...
- Vue管理系统前端系列二相关工具引入及封装
目录 sass-loader/vuex 等的引入说明 引入 element 引入 axios 1.基本使用 2.封装使用 2.1 开发环境配置请求地址 2.2 配置代理 2.3 添加接口相关文件 sa ...
- 初入Shell
shell 第1章 Shell概述 大数据程序员为什么要学习Shell呢? 1)需要看懂运维人员编写的Shell程序. 2)偶尔会编写一些简单Shell程序来管理集群.提高开发效率. 第2章 Shel ...
- wsgi的environ变量
The environ dictionary is required to contain these CGI environment variables, as defined by the Com ...
- Solon详解(五)- Solon扩展机制之Solon Plugin
Solon 中也有一种非常解耦的扩展机制:Solon Plugin.这种扩展机制和Spring Factories很像,和SPI也很像. 一.Solon 中的扩展机制 在Solon的扩展插件加载机制, ...