题意: 给n个点m条边及每条边所花费的时间,经过给定的p个点时会停留k秒,要求在t秒内从1号点走到n号点,若可以走到输出最短时间,若不行输出-1.。

题解:读取边时,将每个点停留的时间加到以其为终点的边的花费上。比如边1 2 10,且2是给定的停留点(设停留5s),则读入这条边时按 1 2 15 读入,然后正常dijkstra即可。

坑点:单位有分有秒/有向边/参数貌似很多。由于一直找不到wa在哪里,先是怀疑爆int,然后把那个多余的map简化成了bool数组,又把输出时的if,else优化了一下,(只是把代码弄得短一些,然并卵)最后怀疑邻接链表有问题,全部改成链式前向星ORZ,依然并卵。又怀疑dijkstra要加vis数组,依然并卵。最后改priority_queue,先发现prioirity_queue<int,vector<int>,greater<int> > 报错,只能用了一个point结构体重载+-,然而并没有什么卵用!!最后发现自己多写了一行T*=60 Orz

ac代码:

#include<iostream>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
const ll maxn = 1e5 + ;
ll n, m, k, p;
long long T;
vector< pair<ll, ll> > E[maxn];
ll d[maxn];
map<ll, ll> pine;
void init() {
for (ll i = ; i <maxn; i++) E[i].clear(), d[i] = 2e18;
}
int main()
{ while (cin >> n >> m >> T >> k >> p) {
//T *= 60;
for (ll i = ; i<p; i++) {
ll x; cin >> x; pine[x]++;
} init();
for (ll i = ; i < m; i++) {
ll x, y;
long long z;
cin >> x >> y >> z;
z *= ; if (pine.count(y))
E[x].push_back(make_pair(y, z + k));
else E[x].push_back(make_pair(y, z));
} ll s = , t = n;
priority_queue<pair<ll, ll> > Q;
d[s] = ; Q.push(make_pair(-d[s], s));
while (!Q.empty()) {
ll now = Q.top().second;
Q.pop(); for (ll i = ; i < E[now].size(); i++)
{
ll v = E[now][i].first;
if (d[v] > d[now] + E[now][i].second) {
d[v] = d[now] + E[now][i].second; Q.push(make_pair(-d[v], v));
}
}
} if (d[t] == 2e18 || d[t] > T * )cout << - << endl;
else cout << d[t] << endl; }
}

一度改得面目全非:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
const long long maxn = ;
typedef long long ll;
ll n, m, k, p,T;
ll pine[maxn];
ll head[maxn], now,dis[maxn],vis[maxn];
struct edge {
ll to, next, val;
}e[*maxn];
void addedge(ll x, ll y, ll z) {
e[++now].to = y, e[now].val = z, e[now].next = head[x], head[x] = now;
}
struct point {
ll val, id;
point(ll id, ll val) :id(id), val(val) {}
bool operator <(const point &x) const {
return val > x.val;
}
};
void dij(ll s) {
priority_queue<point>Q;
Q.push(point(s, ));
vis[s] = ;
dis[s] = ;
while (!Q.empty()) {
ll cur = Q.top().id;
Q.pop();
vis[cur] = ;
for (ll i = head[cur]; i != -; i = e[i].next) {
ll id = e[i].to;
if (!vis[id] && (dis[cur] + e[i].val < dis[id] || dis[id] == -)) {
dis[id] = dis[cur] + e[i].val;
Q.push(point(id, dis[id]));
}
}
} }
int main(){ scanf("%lld%lld%lld%lld%lld", &n, &m, &T, &k, &p);
memset(head, -, sizeof(head));
memset(dis, -, sizeof(dis));
//T *= 60;
for (ll i = ; i<p; i++) {
ll x; scanf("%lld", &x); pine[x] = ;
}
for (ll i = ; i < m; i++) {
ll x, y;
long long z;
scanf("%lld%lld%lld", &x, &y, &z);
z *= ;
addedge(x, y, k*pine[y] + z);
}
dij();
if (dis[n] <= T * ) printf("%lld", dis[n]);
else printf("-1");
}

Gym - 101628F Find the Inn dijkstra,读边时计算新权值的更多相关文章

  1. 紧急救援 L2-001 dijkstra 打印路径 最短路条数 权值

    较为复杂的dijkstra 包含路径打印  最小路的条数  最小路径的情况下取最大权值 v0要是标记就会出错...? 有权值的题目  不能设置mp[i][i]为0  否则会无限加权 这题很有参考价值 ...

  2. POJ 1797 Heavy Transportation(Dijkstra变形——最长路径最小权值)

    题目链接: http://poj.org/problem?id=1797 Background Hugo Heavy is happy. After the breakdown of the Carg ...

  3. POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你 ...

  4. 51nod1459(带权值的dijkstra)

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

  5. 读匿名object对象的属性值

    读匿名object对象的属性值 1.定义读object对象值的功能方法 public static class StaticClass { public static string ValueByKe ...

  6. Dijkstra算法为什么权值不能为负

    Dijkstra算法当中将节点分为已求得最短路径的集合(记为S)和未确定最短路径的个集合(记为U),归入S集合的节点的最短路径及其长度不再变更,如果边上的权值允许为负值,那么有可能出现当与S内某点(记 ...

  7. Code Complete 读后总结和新的扩展阅读计划

    Code Complete 读后总结和新的扩展阅读计划 用了一年时间终于将代码大全读完了,在这里做一个简单的总结,并安排下一阶段的扩展阅读计划. 1.选择代码大全作为我程序员职业入门的第一本书,我认为 ...

  8. Dijkstra的双栈算术表达式求值算法

    这次来复习一下Dijkstra的双栈算术表达式求值算法,其实这就是一个计算器的实现,但是这里用到了不一样的算法,同时复习了栈. 主体思想就是将每次输入的字符和数字分别存储在两个栈中.每遇到一个单次结束 ...

  9. Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离

    Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离,既不是DFS搜索,也不是BFS搜索. 把Dijkstra 算法应用于无权图,或者所有边的权都相等的图,Dijkstra 算法等同于 ...

随机推荐

  1. SpringBoot------添加保存时自动编译插件

    .右键Java项目 .选择“Spring Tools” 3.选择“Add Boot DevTools” 4.每次使用Ctrl + S键时就会自动编译了 实际上是在Pom.xml文件中添加了如下Java ...

  2. SpringMVC -- 梗概--源码--壹--收参

    附:实体类 Class : User package com.c61.entity; import java.text.SimpleDateFormat; import java.util.Date; ...

  3. Java 代码块:静态代码块、构造代码块、构造函数块

    Class : StaticFa package edu.bai.du.lime.staticCode; public class StaticFa { // 随着类的声明而执行 static { S ...

  4. MongoDB副本集的工作原理

    在MongoDB副本集中,主节点负责处理客户端的读写请求,备份节点则负责映射主节点的数据. 备份节点的工作原理过程可以大致描述为,备份节点定期轮询主节点上的数据操作,然后对自己的数据副本进行这些操作, ...

  5. RESTful状态码说明

    https://www.zhihu.com/question/58686782/answer/159603453 常用状态码: 200 请求成功并返回所需资源 400 客户端请求有语法错误 401 未 ...

  6. Ansible的Playbook的编写

    在Ansible中,将各个模块组合起来成为一个YAML格式的配置文件,这个配置文件叫做Playbook, Playbook和模块的关系类似于shell脚本和Linux命令之间的关系. Playbook ...

  7. 使用composer进行依赖管理:以guzzle为例

    今天突然发现一个不错的php http客户端库guzzle,欣喜不已,跃跃欲试.打开guzzle文档,发现需要composer做依赖管理.之前没有接触过composer,正好以此学习下,也蛮好! 本文 ...

  8. django初体验 学习笔记

    django环境搭建     1.安装Python     2.ipython         sudo apt-get install ipython         sudo pip instal ...

  9. ngingx安装错误 ./configure: error: the HTTP rewrite module requires the PCRE library.

    有时候,我们需要单独安装nginx,来处理大量的下载请求.单独在Centos5安装nginx遇到的rewrite和HTTP  cache错误解决办法: wget http://nginx.org/do ...

  10. thinkphp3.2 判断星期几

    后台 $w=date('w'); $week=array( "=>"星期日", "=>"星期一", "=>&qu ...