题目

题解思路

知道是最短路,怎么建图呢?
一开始想到每层来一个超级源点,但是方向不知道怎么确定,用双向边果然WA了(如果是双向边,那一层的都会变成0费连通了 )。
翻了翻 大佬的博客
大佬定义了一种规则,让这个超级源点实现了功能

对于上下层的源点,进行 点 到 源点 单向连通
对于本层源点进行 源点 到 点单向连通
思考一下 如果反过来 也是可行的

属实巧妙啊!
然后就是跑最短路了,这里是10的5次方,朴素的迪杰斯特拉肯定会TLE,刚好没用过堆优化和邻接表,试试水!
堆优化 记得重载运算符 ( 这个运算符是优先队列用的 )

struct bian
{int z,w;bool operator < (const bian &other) const{return w > other.w;}
};

AC代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define INF 0x3f3f3f3f
int li[200020];
bool vis[200020];
struct bian
{int z,w;bool operator < (const bian &other) const{return w > other.w;}
};
vector <bian> head[200020];
int dis[200020] ;
int fb ( int x )
{if (x < 0 )return -x;return x;
}
int main ()
{ios::sync_with_stdio(false);int t,sum = 1;cin>>t;while(t--){int n,m,c,ceshu = 0;bian tmm ;cin>>n>>m>>c;for ( int i = 1 ;i <= n ; i++){int ti;cin>>ti;ceshu = max(ceshu,ti);  //取出层数li [i] = ti ;}for (int i = n+1 ; i<= n+ceshu ; i++)li[i] = i - n;  //建立超级源点for (int i = 1 ;i <= n ; i++ ){tmm.z =n+li[i] ;tmm.w = 0 ;head[ i ].push_back (tmm);  //建立和超级源点的单向边}for (int i = 1 ; i<= n ; i++){tmm.w = c;if ( li[i] >  1 ){tmm.z =  i ;head[ n+li[i]-1 ].push_back(tmm);  //向和下方的超级源点连接}if ( li[i] < ceshu){tmm.z = i ;head[ n+li[i]+1 ].push_back(tmm); //向和上方的超级源点连接}}for (int i = 1 ;i <= m ; i++ ){int a,b,wahs;cin>>a>>b>>wahs;tmm.z = b;tmm.w = wahs;head[a].push_back(tmm);tmm.z = a;head[b].push_back(tmm);  //建立原本的额外边}/*   for (int i = 1 ;i <= ceshu+n ; i++ ){printf("以%d为首的边\n",i);int pint = head[i].size();for (int k = 0 ;k < pint ; k++ )printf("%d %d %d\n",i,head[i][k].z,head[i][k].w );printf("\n");}  */for (int i = 1 ; i <= n+ceshu ; i++ )dis[ i ] = INF ;  //初始化dis数组memset(vis,0,sizeof(vis));dis [ 1 ] = 0;  //以1为起点出发priority_queue < bian > q;tmm.w = 0;tmm.z = 1;q.push(tmm);  //将起点放入优先队列while(!q.empty()){tmm = q.top();q.pop();            //取出和源点最近的点并出队int go = tmm.z;if (vis[go])continue;vis[go] = 1;for (int i = 0 ; i <head[go].size() ; i++){tmm = head[go][i];    //对该源点有的边 进行松弛判断if (dis[tmm.z] > dis[go] + tmm.w ){dis[tmm.z] = dis[go] + tmm.w;bian e;e.w = dis[tmm.z];e.z = tmm.z;q.push(e);  //将 已经被松弛的点 和 当前松弛该点到起点的最小距离 入队}}}cout<<"Case #"<<sum<<": ";sum++;if (dis[n] == INF)cout<<"-1\n";elsecout<<dis[n]<<"\n";for (int i = 1 ;i <= n + ceshu ; i++ )  //每次用完初始化head[i].clear();}return 0;
}

HDU 4725 层级最短路 思维建图 邻接表 堆优化迪杰斯特拉 真的难想 区域网络赛真题相关推荐

  1. Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))

    题目大意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接 到达终点站,是单向的,每条路线有它自己的车费.有P个人早上从1出发 ,他们要到达每一个公交站点, 然后到了晚上再返回点 ...

  2. CodeForces - 1529F It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!(最短路+思维建图)

    题目链接:点击查看 题目大意:给出 nnn 个点(从 000 开始编号)和 mmm 条边的有向带权图,不过 mmm 条边是动态的,经过 ttt 秒后,第 iii 条边就从 ai−>bi,cia_ ...

  3. HDU - 5521 Meeting(最短路+思维建边)

    题目链接:点击查看 题目大意:给出 n 个点,再给出 m 个集合,对于每个集合中的点来说,其两两都是相互可达的,且花费都相同,问有多少个点,到达点 1 和点 n 的距离相同且最小 题目分析:因为每个集 ...

  4. Java图结构-模拟校园地图-迪杰斯特拉(Dijkstra)算法求最短路径 #谭子

    目录目录 一.前言 二.模拟校园地图描述 三.分析题目及相关绘图 四.代码部分 1.GraphNode类 2.Menu类(管理文字) 3.Attraction类 4.AttractionGraph类( ...

  5. 图的应用——最短路径(迪杰斯特拉算法)

    Content 1. 什么是最短路径 2. 迪杰斯特拉算法[O(n^2^)] 3. 代码 4. 迪杰斯特拉算法 VS 普利姆算法 1. 什么是最短路径 在一个带权有向图中,从某一顶点到另一顶点可能有很 ...

  6. CodeForces - 1422D Returning Home(最短路+思维建图)

    题目链接:点击查看 题目大意:给出一个 n * n 的二维平面,现在要从点 ( sx , sy ) 到达点 ( fx , fy ),在平面上有 m 个传送门,共有两次操作: 向上.下.左.右移动一个单 ...

  7. 图的最短路径之(迪杰斯特拉算法)python实现

    前面我们已经了解到了无环有向图怎样求关键路径的方法,今天我们来看看无向图怎样求最短路径,这在实际应用过程中的作用很大,不如交通路线图,从出发点到终点,走哪条路用时最短,或者花费最少等问题. 我们先来看 ...

  8. 拯救007 迪杰斯特拉最短路解决

    思路:直接建图,走一遍迪杰斯特拉,最后比较一下能到达边界点的最短路径就可以了.正确性还没具体验证,不过样例过了. #include<cstdio> #include<iostream ...

  9. Dijkstra(迪杰斯特拉)求解最短路(附python代码和可视化)

    文章目录 前言 一.最短路模型 二.迪杰斯特拉算法 二.python代码实现 结果展示 前言 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算 ...

最新文章

  1. SVN linux 服务器端配置
  2. 从小部件的调整入手,AI 让你秒变时尚达人
  3. mysql Table 'plugin' already exists
  4. Java 寻找幸运数
  5. 你拍的最让你「惊喜」的照片是哪张?
  6. MySQL5.6 Performance_schema
  7. cookie、Session、Token、sessionStorage、localStorage简介__Token放在 cookie, sessionStorage 和 localStorage中区别
  8. 中国宠物经济创新发展研究报告
  9. 【重识 HTML + CSS】CSS 选择器
  10. Dubbo + Zookeeper入门初探(转载)
  11. java解释器是哪个命令_宽恕命令解释器的最佳Java库(IES)
  12. [Everyday Mathematics]20150112
  13. java datagrid导出excel_Datagrid数据导出到Excel文件给客户端下载的几种方法
  14. 基于springboot的会员后台管理系统
  15. librtmp的简单安装使用
  16. EasyNVR是怎么做到Web浏览器播放RTSP摄像机直播视频延时控制在一秒内的
  17. fiddler拦截手机端请求
  18. c语言大作业 模拟泊松分布,怎样用C语言模拟泊松分布
  19. Flink Could not find any factory for identifier ‘json‘ that implements DeserializationFormatFactory
  20. 基于Python Scrapy爬虫改进KNN算法的网站分类系统

热门文章

  1. 数据结构——顺序表的基本操作
  2. (无刀流 龙卷风)科来网络分析系统免费版下载
  3. android 手势密码功能sdk,利用ActivityLifecycleCallBack监控app前后台状态切换,实现手势密码即九宫格解锁...
  4. ocx开发经验,ActiveX开发快速入门
  5. ubuntu下安装sbt(参考林子雨教程会有问题)
  6. Could not locate PropertySource: I/O error on GET request for “http://localhost:8888/
  7. php获取文件后缀名的几种方法
  8. 如何读取thumbs.db里的缩略图?(downmoon)
  9. **海量搜索解决方案_Spring Data Solr [篇1/共3篇]*
  10. 大势至服务器文件备,大势至服务器文件