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 ...
随机推荐
- mysql主主半同步
1.半同步概述 先了解下mysql的几种复制 异步复制MySQL复制默认是异步复制,Master将事件写入binlog,提交事务,自身并不知道slave是否接收是否处理:缺点:不能保证所有事务都被所有 ...
- 010_go语言中的maps映射(字典)
代码演示 package main import "fmt" func main() { m := make(map[string]int) m["k1"] = ...
- linux系统中SSH免密设置报错
执行 ssh-add ~/.ssh/msi_rsa 时报下面错误 Could not open a connection to your authentication agent. 解决办法: 执行命 ...
- Homekit_二路继电器
介绍一款二路继电器,使用Homekit进行控制,有兴趣的可以去以下链接看看: https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-11265006 ...
- flask_restful 的reqparse获取验证前端参数
required是设置必选非必选,nullable允不允许向传null,location指定参数获取的位置,可以多选,按前后顺序获取 parser.add_argument('app_id', typ ...
- 攻防世界-web(进阶)-Training-WWW-Robots
进行后台扫描,发现一个robots.txt,进入之后说存在fl0g.php,进入即可得flag. cyberpeace{73279bc0d3c28ba6da4d1d3d530e7c16}
- vue报错vue-router.esm.js?8c4f:2007 Uncaught (in promise) NavigationDuplicated {_name: "NavigationDuplicated", name: "NavigationDuplicated"}
今天在写vue项目配置好路由点击菜单时,突然在控制台报错. 错误信息如下: Uncaught (in promise) NavigationDuplicated {_name: "Navig ...
- 2020大厂web前端面试常见问题总结
本篇收录了一些面试中经常会遇到的经典面试题以及自己面试过程中遇到的一些问题.通过对本篇知识的整理以及经验的总结,希望能帮到更多的前端面试者. 1.web前端项目的结构是怎样的?文件有哪些命名规范? 项 ...
- Android app启动出现白屏闪屏
出现白屏闪屏原因: 进入到AppStartActivity,但是未加载到布局文件,就先显示了窗口的背景,白屏就是显示的windows的背景,即所设置的theme. onCreate()中的setCon ...
- Windows下nacos单机部分发现的坑
一.下载nacos的地址: https://github.com/alibaba/nacos/releases 下载 nacos-server-1.3.2.tar.gz 就好 二.在Window ...