csu1808
csu1808
题意
n 个点间有 m 条地铁,每条地铁可能属于不同的线路,每条地铁有权值即通过时花费的时间,如果乘坐第 i 条地铁来到地铁站 s,再乘坐第 j 条地铁离开,需要花费额外的时间 \(|c[i] - c[j]|\) 即地铁线路之差。
分析
点本身不具有线路信息,如果直接对点做最短路,无法判断要更新的点是来自于哪个线路。
而边具有唯一的线路信息,可以直接把边当成点,使用链式前向星来构造图,对边做最短路。
code
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<ll, int> P;
const ll INF = 1e15;
const int MAXN = 2e5 + 10;
int head[MAXN];
int cnt;
struct Edge {
int next, to, stp;
ll w;
}edge[MAXN];
void add(int u, int v, int stp, ll w) {
edge[cnt].w = w;
edge[cnt].to = v;
edge[cnt].stp = stp;
edge[cnt].next = head[u];
head[u] = cnt++;
}
int n, m;
vector<Edge> g[MAXN];
ll d[MAXN];
ll ans;
int vis[MAXN];
void dijkstra() {
ans = INF;
priority_queue<P, vector<P>, greater<P> > que;
memset(vis, 0, sizeof vis);
for(int i = 0; i <= cnt; i++) d[i] = INF;
for(int i = head[1]; ~i; i = edge[i].next) {
d[i] = edge[i].w;
que.push(P(edge[i].w, i));
}
while(!que.empty()) {
P p = que.top();
que.pop();
int u = p.second;
vis[u] = 1;
if(edge[u].to == n) {
ans = min(ans, d[u]);
}
for(int i = head[edge[u].to]; ~i; i = edge[i].next) {
if(!vis[i] && d[i] > d[u] + edge[i].w + abs(edge[i].stp - edge[u].stp)) {
d[i] = d[u] + edge[i].w + abs(edge[i].stp - edge[u].stp);
que.push(P(d[i], i));
}
}
}
}
int main() {
while(~scanf("%d%d", &n, &m)) {
memset(head, -1, sizeof head);
cnt = 0;
for(int i = 0; i < m; i++) {
int x, y, z;
ll k;
scanf("%d%d%d%lld", &x, &y, &z, &k);
add(x, y, z, k);
add(y, x, z, k);
}
dijkstra();
printf("%lld\n", ans);
}
return 0;
}
csu1808的更多相关文章
- 【CSU1808】地铁
ICPCCamp 有 n 个地铁站,用 1,2,-,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i 段地铁属于 ci 号线,位于站 ai,bi 之间,往返均需要花费 ti 分钟(即从 ...
- CSU1808 地铁 —— dijkstra变形
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1808 题解:由于中转线路需要花费一定的时间,所以一般的以顶点为研究对象的dijkst ...
- 2017年暑假ACM集训日志
20170710: hdu1074,hdu1087,hdu1114,hdu1159,hdu1160,hdu1171,hdu1176,hdu1010,hdu1203 20170711: hdu1231, ...
随机推荐
- php中utf-8转unicode
public function utf8_unicode($str) { $unicode = array(); $values = array(); $lookingFor = 1; for ($i ...
- 什么是EM算法?
开头借用李航老师书中总结,概率模型有时既含有观测变量,又含有隐藏变量或者潜在变量,如果概率模型的变量都是观测变量,那么给定数据,可以直接用极大似然估计法,或者贝叶斯估计法估计模型参数,但是,当模型含有 ...
- WordPress多本小说主题–WNovel主题发布,十分钟搭建小说站! 现已更新至1.2版本
本文属于<WNovel主题操作手册>文章系列,该系列共包括以下 8 部分: WNovel主题使用手册之–主题安装及更新教程 WNovel主题使用手册之–小说管理 WNovel主题使用手册之 ...
- 2017 多校4 Wavel Sequence
2017 多校4 Wavel Sequence 题意: Formally, he defines a sequence \(a_1,a_2,...,a_n\) as ''wavel'' if and ...
- 《R语言实战》读书笔记--为什么要学
本人最近在某咨询公司实习,涉及到了一些数据分析的工作,用的是R语言来处理数据.但是在应用的过程中,发现用R很不熟练,所以再打算学一遍R.曾经花一个月的时间看过一遍<R语言编程艺术>,还用R ...
- Spring和ActiveMQ集成实现队列消息以及PUB/SUB模型
前言:本文是基于Spring和ActiveMQ的一个示例文章,包括了Point-To-Point的异步队列消息和PUB/SUB(发布/订阅)模型,只是做了比较简单的实现,无任何业务方面的东西,作为一个 ...
- 前端模块加载规范AMD与CMD小记
AMD代表:requirejs: CMD代表:seajs: AMD CMD 代表 requirejs seajs 执行 提前加载,不管是否调用模块,先解析所以模块 提前加载,在真正需要使 ...
- MFC 按钮
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上 ((CButton *)GetDlgItem(IDC_RADIO1))-> ...
- hdu 6114 百度之星复赛B T1
Chess Problem Description 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子. 一天,小度在棋盘上摆起了许多車……他想知道,在一共N×M个点的矩形棋盘中 ...
- Hibernate中的延迟加载及fetch
Hibernate中的延迟加载 1.类级别的查询策略: lazy : true(默认值) false(立即加载) 2.多对一关联的查询策略: lazy: proxy(默认值) no-proxy ...