HDU 4725 层级最短路 思维建图 邻接表 堆优化迪杰斯特拉 真的难想 区域网络赛真题
题目
题解思路
知道是最短路,怎么建图呢?
一开始想到每层来一个超级源点,但是方向不知道怎么确定,用双向边果然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 层级最短路 思维建图 邻接表 堆优化迪杰斯特拉 真的难想 区域网络赛真题相关推荐
- Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))
题目大意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接 到达终点站,是单向的,每条路线有它自己的车费.有P个人早上从1出发 ,他们要到达每一个公交站点, 然后到了晚上再返回点 ...
- CodeForces - 1529F It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!(最短路+思维建图)
题目链接:点击查看 题目大意:给出 nnn 个点(从 000 开始编号)和 mmm 条边的有向带权图,不过 mmm 条边是动态的,经过 ttt 秒后,第 iii 条边就从 ai−>bi,cia_ ...
- HDU - 5521 Meeting(最短路+思维建边)
题目链接:点击查看 题目大意:给出 n 个点,再给出 m 个集合,对于每个集合中的点来说,其两两都是相互可达的,且花费都相同,问有多少个点,到达点 1 和点 n 的距离相同且最小 题目分析:因为每个集 ...
- Java图结构-模拟校园地图-迪杰斯特拉(Dijkstra)算法求最短路径 #谭子
目录目录 一.前言 二.模拟校园地图描述 三.分析题目及相关绘图 四.代码部分 1.GraphNode类 2.Menu类(管理文字) 3.Attraction类 4.AttractionGraph类( ...
- 图的应用——最短路径(迪杰斯特拉算法)
Content 1. 什么是最短路径 2. 迪杰斯特拉算法[O(n^2^)] 3. 代码 4. 迪杰斯特拉算法 VS 普利姆算法 1. 什么是最短路径 在一个带权有向图中,从某一顶点到另一顶点可能有很 ...
- CodeForces - 1422D Returning Home(最短路+思维建图)
题目链接:点击查看 题目大意:给出一个 n * n 的二维平面,现在要从点 ( sx , sy ) 到达点 ( fx , fy ),在平面上有 m 个传送门,共有两次操作: 向上.下.左.右移动一个单 ...
- 图的最短路径之(迪杰斯特拉算法)python实现
前面我们已经了解到了无环有向图怎样求关键路径的方法,今天我们来看看无向图怎样求最短路径,这在实际应用过程中的作用很大,不如交通路线图,从出发点到终点,走哪条路用时最短,或者花费最少等问题. 我们先来看 ...
- 拯救007 迪杰斯特拉最短路解决
思路:直接建图,走一遍迪杰斯特拉,最后比较一下能到达边界点的最短路径就可以了.正确性还没具体验证,不过样例过了. #include<cstdio> #include<iostream ...
- Dijkstra(迪杰斯特拉)求解最短路(附python代码和可视化)
文章目录 前言 一.最短路模型 二.迪杰斯特拉算法 二.python代码实现 结果展示 前言 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算 ...
最新文章
- SVN linux 服务器端配置
- 从小部件的调整入手,AI 让你秒变时尚达人
- mysql Table 'plugin' already exists
- Java 寻找幸运数
- 你拍的最让你「惊喜」的照片是哪张?
- MySQL5.6 Performance_schema
- cookie、Session、Token、sessionStorage、localStorage简介__Token放在 cookie, sessionStorage 和 localStorage中区别
- 中国宠物经济创新发展研究报告
- 【重识 HTML + CSS】CSS 选择器
- Dubbo + Zookeeper入门初探(转载)
- java解释器是哪个命令_宽恕命令解释器的最佳Java库(IES)
- [Everyday Mathematics]20150112
- java datagrid导出excel_Datagrid数据导出到Excel文件给客户端下载的几种方法
- 基于springboot的会员后台管理系统
- librtmp的简单安装使用
- EasyNVR是怎么做到Web浏览器播放RTSP摄像机直播视频延时控制在一秒内的
- fiddler拦截手机端请求
- c语言大作业 模拟泊松分布,怎样用C语言模拟泊松分布
- Flink Could not find any factory for identifier ‘json‘ that implements DeserializationFormatFactory
- 基于Python Scrapy爬虫改进KNN算法的网站分类系统
热门文章
- 数据结构——顺序表的基本操作
- (无刀流 龙卷风)科来网络分析系统免费版下载
- android 手势密码功能sdk,利用ActivityLifecycleCallBack监控app前后台状态切换,实现手势密码即九宫格解锁...
- ocx开发经验,ActiveX开发快速入门
- ubuntu下安装sbt(参考林子雨教程会有问题)
- Could not locate PropertySource: I/O error on GET request for “http://localhost:8888/
- php获取文件后缀名的几种方法
- 如何读取thumbs.db里的缩略图?(downmoon)
- **海量搜索解决方案_Spring Data Solr [篇1/共3篇]*
- 大势至服务器文件备,大势至服务器文件