题目链接: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)的更多相关文章

  1. Dijkstra 单源最短路径算法

    Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...

  2. 最短路径算法-Dijkstra

    Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...

  3. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

  4. POJ 2253 Frogger(Dijkstra)

    传送门 Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39453   Accepted: 12691 Des ...

  5. POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)

    传送门 Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 46727   Acce ...

  6. Dijkstra 算法

    all the nodes should be carectorized into three groups: (visited, front, unknown) we should pay spec ...

  7. 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)

    题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...

  8. 51nod1459(带权值的dijkstra)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 题意:中文题诶- 思路:带权值的最短路,这道题数据也没 ...

  9. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

随机推荐

  1. ZOJ - 4016 Mergeable Stack 【LIST】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4016 题意 模拟栈的三种操作 第一种 push 将指定元素压入指 ...

  2. matlab添加当前文件夹到函数搜索目录

    pwd表示当前路径p = genpath(folderName) 返回一个包含路径名称的字符向量,该路径名称中包含 folderName 以及 folderName 下的多级子文件夹. addpath ...

  3. ios图文混编瀑布流

    ios图文混编瀑布流,利用UICollectionView 实现图文混编的瀑布流,支持section内容伸缩 http://www.huiyi8.com/pubuliu/

  4. BZOJ 1641 [Usaco2007 Nov]Cow Hurdles 奶牛跨栏:新版floyd【路径上最大边最小】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1641 题意: 给你一个有向图,n个点(n <= 300),m条边,边权为h[i]. ...

  5. html5--2.7新的布局元素(4)-time

    html5--2.7新的布局元素(4)-time 学习要点 了解微格式的概念 掌握time元素的用法 微格式的概念 HTML5中的微格式,是一种利用HTML5中的新标签对网页添加附加信息的方法,附加信 ...

  6. VC++中list::list的使用方法总结

    本文主题 这几天在做图像处理方面的研究,其中有一部分是关于图像分割方面的,图像目标在分割出来之后要做进一步的处理,因此有必要将目标图像的信息保存在一个变量里面,一开始想到的是数组,但是马上就发现使用数 ...

  7. 2018.3.3 How too much fructose may cause liver damage

    Fructose is the sweetest of the natural sugars. As its name suggests, it is found mainly in fruits. ...

  8. Unix环境编程之文件IO

    1.文件IO 2.文件与目录 3.进程 4.多线程编程 5.信号 6.进程间通信 学习linux编程,首先要学会使用shell,这里一些基础命令就不介绍了.这里唯一要提的一个shell命令就是man. ...

  9. linux进程学习-进程描述符的存储

    当进程被新建时,内核会给进程分配一个8K的空间作为进程的内核堆栈.同时我们知道task_struct结构体也会被创建,但有意思的是,内核不会给task_struct单独分别空间,而是直接将其扔到8k的 ...

  10. 小程序js页面设置上导航颜色

    //导航条颜色更改 wx.setNavigationBarColor({ frontColor: '#ffffff', // 必写项 backgroundColor: '#008de6', // 必写 ...