hdu2612(dijkstra)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612
题意:给出一个n*m的矩阵,' . ' 表示可以走的路, ' # '表示不能走的路 ,’ @'表示KCF, ‘Y' , 'M' 表示两个人开始的位置,
他们可以走到相邻的路,每走一步需要11分钟,问他们要在KCF见面,最少需要花多少时间。
思路:我们可以把矩阵化成图,再通过dijkstra求出Y和M到各个KCF的距离,然后找对应和最小的就是答案啦。
注意这里矩阵最大为200*200,所以有40000个节点,我们需要对dijkstra做堆优化,不然能会超时。
代码:
#include <iostream>
#include <stdio.h>
#include <queue>
#include <string.h>
#define MAXN 210
using namespace std; vector<pair<int, int> > vec[MAXN*MAXN];//***记录图
bool vis[MAXN*MAXN];//***标记该点是否在堆中
const int inf=0x3f3f3f3f;
char mp[MAXN][MAXN];
int n, m, pos=, s1=, s2=, a[MAXN*MAXN]; struct node{//***重载比较符使优先队列非升序排列
int point, value;
friend bool operator< (node a, node b){
return a.value>b.value;
}
}; void get_vec(){//建图
for(int i=; i<MAXN*MAXN; i++){
vec[i].clear();
}
for(int i=; i<n; i++){
for(int j=; j<m; j++){
if(mp[i][j]=='@'){
a[pos++]=i*m+j;
}else if(mp[i][j]=='Y'){
s1=i*m+j;
}else if(mp[i][j]=='M'){
s2=i*m+j;
}
if(mp[i][j]!='#'){
int u=i*m+j;
if(mp[i+][j]!='#'&&i+<n){
int v=(i+)*m+j;
vec[u].push_back({v, });
vec[v].push_back({u, });
}
if(mp[i][j+]!='#'&&j+<m){
int v=i*m+j+;
vec[u].push_back({v, });
vec[v].push_back({u, });
}
}
}
}
} int &dijkstra_heap(int s, int dist[MAXN*MAXN]){//最短路求源点到其他点的距离
priority_queue<node> q;
memset(vis, false, sizeof(vis));
dist[s]=;
q.push({s, dist[s]});
while(!q.empty()){
node u=q.top();
int point=u.point;
q.pop();
if(vis[point]){
continue;
}else{
vis[point]=true;
}
for(int i=; i<vec[point].size(); i++){
int v=vec[point][i].first;
int cost=vec[point][i].second;
if(!vis[v]&&dist[v]>dist[point]+cost){//***松驰操作
dist[v]=dist[point]+cost;
q.push({v, dist[v]});
}
}
}
} int main(void){
while(scanf("%d%d", &n, &m)!=EOF){
int dist1[MAXN*MAXN], dist2[MAXN*MAXN];//***记录源点此时到 i 的最短距离
memset(dist1, 0x3f, sizeof(dist1));
memset(dist2, 0x3f, sizeof(dist2));
for(int i=; i<n; i++){
scanf("%s", mp[i]);
}
pos=;
get_vec();
dijkstra_heap(s1, dist1);
dijkstra_heap(s2, dist2);
int ans=inf;
for(int i=; i<pos; i++){
ans=min(dist1[a[i]]+dist2[a[i]], ans);
}
cout << ans* << endl;
}
return ;
}
hdu2612(dijkstra)的更多相关文章
- Dijkstra 单源最短路径算法
Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...
- 最短路径算法-Dijkstra
Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...
- [板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...
- POJ 2253 Frogger(Dijkstra)
传送门 Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39453 Accepted: 12691 Des ...
- POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)
传送门 Til the Cows Come Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 46727 Acce ...
- Dijkstra 算法
all the nodes should be carectorized into three groups: (visited, front, unknown) we should pay spec ...
- 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)
题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...
- 51nod1459(带权值的dijkstra)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 题意:中文题诶- 思路:带权值的最短路,这道题数据也没 ...
- 求两点之间最短路径-Dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...
随机推荐
- keras: 在构建LSTM模型时,使用变长序列的方法
众所周知,LSTM的一大优势就是其能够处理变长序列.而在使用keras搭建模型时,如果直接使用LSTM层作为网络输入的第一层,需要指定输入的大小.如果需要使用变长序列,那么,只需要在LSTM层前加一个 ...
- linux下chrome和chromedriver的安装
1.安装chrome 用下面的命令安装最新的 Google Chrome yum install https://dl.google.com/linux/direct/google-chrome-st ...
- NLP数据集大放送,再也不愁数据了!【上百个哦】
奉上100多个按字母顺序排列的开源自然语言处理文本数据集列表(原始未结构化的文本数据),快去按图索骥下载数据自己研究吧! 数据集 Apache软件基金会公开邮件档案:截止到2011年7月11日全部公开 ...
- Redis 的持久化与过期键
简介 Redis 是使用非常广泛的 Key-Value 内存数据库.因为数据都存放在内存中,所以存取速度非常快.不过,很多情况下我们需要将 Redis 中的数据保存到硬盘中以便做备份.Redis 提供 ...
- CMake最好的学习资料
本文为转载,阅读不友好,请先查看原文:https://blog.gmem.cc/cmake-study-note 收下为原文内容================> 基础知识 CMake简介 CM ...
- Quartz的misfire理解
misfire用于Trigger触发时,线程池中没有可用的线程或者调度器关闭了,此时这个Trigger变为misfire.当下次调度器启动或者有可以线程时,会检查处于misfire状态的Trigger ...
- Android蓝牙通讯【转】
本文转载自:http://blog.csdn.net/vnanyesheshou/article/details/51554852 随着可穿戴设备的流行,研究蓝牙是必不可少的一门技术了. 总结了下蓝牙 ...
- haproxy 官方文档查看
http://cbonte.github.io/haproxy-dconv/1.5/configuration.html#reqrep http://www.ttlsa.com/linux/hapro ...
- TP框架控制器和对应方法创建
控制器和对应方法创建 控制器是MVC模式中的核心,TP默认有一个控制器: Index控制器里面有一个操作方法:Index 我们在访问http://localhost:8080/Thinkphp ...
- 英特尔® Software Guard Extensions 教程系列:第一部分,英特尔® SGX 基础
英特尔® Software Guard Extensions 教程系列:第一部分,英特尔® SGX 基础 from:https://software.intel.com/zh-cn/articles/ ...