题意: 给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. SpringMVC由浅入深day01_7入门程序小结

    7 入门程序小结 通过入门程序理解springmvc前端控制器.处理器映射器.处理器适配器.视图解析器用法. 前端控制器配置: 处理器映射器: 非注解处理器映射器(了解) 注解的处理器映射器(掌握) ...

  2. windows 下获取当前进程的线程数量

    #include <TlHelp32.h> int get_thread_amount() { ; ]; PROCESSENTRY32 pe32; pe32.dwSize = sizeof ...

  3. mongo数据库查询结果不包括_id字段方法

    db.GPRS_PRODUCT_HIS_FEE.find({"条件字段" : "412171211145135"},{_id:0}) db.GPRS_PRODU ...

  4. ubuntu 上安装vnc server

    Ubuntu下设置VNCServer   Virtual Network Computing(VNC)是进行远程桌面控制的一个软件.客户端的键盘输入和鼠标操作通过网络传输到远程服务器,控制服务器的操作 ...

  5. HTML 水平线

    <hr /> 标签可以在 HTML 页面中创建水平线,通常用来分隔文章中的小节 <!DOCTYPE HTML> <html> <body> <p& ...

  6. mybatis 之 resultType="Integer"

    public class EcPromoteRuleAdditionalNew extends BaseBO { private String[] promoteRuleIds; public Str ...

  7. linux系统如何操作隐藏文件

    在linux下,以点"."开头命名的文件在系统中被视为隐藏文件.因此,如果想隐藏某个文件或目录,一种简单的办法就是把文件名命名为点开头. 对于目录backcron,可以这样操作隐藏 ...

  8. Java的I/O操作

    一.概述 Java的IO支持通过java.io包下的类和接口来完成,在java.io包下主要有包括输入.输出两种IO流,每种输入输出流又可分为字节流和字符流两大类.从JDK1.4以后,Java在jav ...

  9. YII2 model 字段验证提示 Unknown scenario: update

    意思是 update 场景不存在,也就是 定义的 rules 中没有该规则: /** * @inheritdoc * 验证规则 */ public function rules() { return ...

  10. 《征服C指针》读书笔记

    本文同时发布在我的个人博客上,欢迎访问~ www.seekingdream.cn 在读完K&R之后,对C的认识就是指针.数组.网上的人们对指针也有些“敬而远之”的感觉.最近从同学处淘得< ...