题意: 给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------Eclipce配置Spring Boot

    步骤一: 步骤二: 点击左下角Eclipse图标下的“Popular”菜单,选择Spring安装(已安装的插件在Installed中显示),一直按步骤确定就好了,如果中途下载超时什么的,就看看自己的网 ...

  2. Jersey 入门与Javabean

    Jersey是JAX-RS(JSR311)开源参考实现用于构建RESTful Web service,它包含三个部分: 核心服务器(Core Server) 通过提供JSR 311中标准化的注释和AP ...

  3. DATAGUARD的搭建

    ORACLE Data Guard 理论知识 请查看此blog :http://blog.csdn.net/haibusuanyun/article/details/11519241 Oracle D ...

  4. Synchronizing Threads and GUI in Delphi application

    Synchronizing Threads and GUI   See More About delphi multithreading tthread class user interface de ...

  5. NSIS安装vcredist_64.exe

    ; ExecWait ‘vcredist_x86.exe’ # 一般的安装ExecWait ‘”vcredist_x86.exe” /q’ # silent install 静默安装; ExecWai ...

  6. Ubuntu图形界面和字符界面转换、指定默认启动界面

    1.按ALT+CTRL+F1.F2.F3.F4.F5.F6.F7可来回切换7个界面(Linux实体机)      其中ALT+CTRL+F7可切换到图形界面(Linux实体机)        如果是V ...

  7. 数字图像处理笔记与体会(一)——matlab编程基础

    最近开始学习数字图像处理,使用matlab实现,下面我就来记录笔记和体会,一方面是给大家提供参考,另一方面是防止我忘记了. 复习一下: 1.数字图像是用一个数字矩阵来表示的,数字阵列中的每个数字,表示 ...

  8. PowerDesigner学习笔记

    首先是概念模型个物理模型的区别,概念模型,即ConceptualDataMode,是没和具体类型的数据库(如SQL Server.MySql)的对应,是一种抽象的,而物理模型是指定了某种具体类型的数据 ...

  9. Visual C++中去除警告

    在编程中,编译器警告的意思是提问程序员:如果这样做将会出现意外的错误,你确定要这样做吗? 在很多情况下,我们写程序的时候会出现一些警告,而这些警告我们都知道这样做的确是需要的并且程序中多处出现这种做法 ...

  10. Matlab——filter函数用法

    filter:滤波函数,可用来解差分方程. y = filter(b,a,X) [y,zf] = filter(b,a,X) [y,zf] = filter(b,a,X,zi) y = filter( ...