CSU1808 地铁 —— dijkstra变形
来源:互联网 发布:淘宝正品哥弟女裤 编辑:程序博客网 时间:2024/04/29 23:05
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1808
题解:由于中转线路需要花费一定的时间,所以一般的以顶点为研究对象的dijkstra算法就不适用了,因为在松弛过程中,当前节点的最短路径不能知道是从那条线路过来的。(保存当前结点的上一站是从那条线路过来?看似可以,但是站与站之间的线路又怎么保存。矩阵?[100000][100000],内存不足。领接表?不够高效,因为要扫描链表寻找)
所以就直接把边作为研究对象。将边的信息记录到edge中(包括两端点,线路,以及通行时间)。因为edge已经包含了线路,所以松弛时就可以直接计算了。d[i]记录从顶点1到顶点i的最短路径(题目中为时间)。
代码如下:
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<queue>#include<vector>#include<map>#include<string>#include<set>#define LL long long#define MAX(a,b) (a>b?a:b)#define MIN(a,b) (a<b?a:b)#define INF ((1<<31)-1)#define LNF ((1LL<<62)-1)#define maxn 200010using namespace std;int n,m,vis[maxn],head[maxn],tot;LL d[maxn];struct Node //记录边的信息{ int v,c,t,next;}edge[maxn];void Addedge(int u, int v, int c, int t) //将与u相连通的串在一起,可以用vector{ edge[tot].v = v; edge[tot].c = c; edge[tot].t = t; edge[tot].next = head[u]; head[u] = tot++;}void init(){ memset(head,-1,sizeof(head)); tot = 0;}LL dij(){ priority_queue< pair<LL,int> >q; //队列记录花费的时间以及当前边的编号 memset(vis,0,sizeof(vis)); for(int i = 0; i<tot; i++) d[i] = LNF; for(int i = head[1]; i!=-1; i = edge[i].next) //初始化,顶点1作为u的边入队 { d[i] = edge[i].t; q.push(make_pair(-d[i],i)); //因为优先队列从大到小排,所以要加个负号,使其从小到大排列 } while(!q.empty()) { pair<LL,int>tmp = q.top(); q.pop(); int now = tmp.second; //取边的编号 vis[now] = 1; int u = edge[now].v; if(u==n) return d[now]; //如果当前边的v为顶点n,则找到最短路径 for(int i = head[u]; i!=-1; i = edge[i].next) //松弛 { int v = edge[i].v; if(!vis[i] && d[i]>d[now]+edge[i].t + abs(edge[i].c - edge[now].c)) //abs(***)为转站花费的时间,如果相同,即为0 { d[i] = d[now] + edge[i].t + abs(edge[i].c - edge[now].c); q.push(make_pair(-d[i],i)); } } }}int main(){ int u,v,c,t; while(scanf("%d%d",&n,&m)!=EOF) { init(); for(int i = 0; i<m; i++) { scanf("%d%d%d%d",&u,&v,&c,&t); Addedge(u,v,c,t); Addedge(v,u,c,t); } printf("%lld\n",dij()); }}
0 0
- CSU1808 地铁 —— dijkstra变形
- CSU1808 地铁
- csu1808 地铁
- 最短路 csu1808 地铁
- CSU 1808 地铁(Dijkstra变形+构图)
- csu1808 地铁(最短路)
- csu1808(优先级队列+Dijkstra)
- csu 1808 地铁 dijkstra变形+优先队列优化
- CCF 2017 03 04修地铁(dijkstra变形)
- poj1797Heavy Transportation——Dijkstra变形
- 2016湖南省省赛F-地铁(CSU1808)
- poj1062——昂贵的聘礼(dijkstra变形)
- 地铁换乘—华为2014校招机试样题 —Dijkstra 和 Floyd-Warshall 算法解决
- [CSU 1808: 地铁] Dijkstra
- CSU 1808 地铁(dijkstra+heap)
- CSU 1808 地铁 (Dijkstra)
- Dijkstra算法之地铁修建
- floyd 变形或Dijkstra 变形
- Java 使用记事本编写第一个java程序
- 解决:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
- 使用dom4j解析xml(示例代码)
- 关于VIM
- java xml Document解析
- CSU1808 地铁 —— dijkstra变形
- 由两个栈组成队列
- 网站搭建心得
- 1. eclipse下创建第一个spring boot项目
- docker配置国内仓库镜像registry-mirror
- 蓝桥杯 风险度量
- nyoj ACM:表达式求值 (堆栈)
- 【JavaWeb】WEB下excel导出
- springMVC jsp中用el表达式获取不到后台数据