[codevs2070]爱情之路

试题描述

yh非常想念他的女朋友小y,于是他决定前往小y所在的那块大陆。

小y所在的大陆共有n个城市,m条双向路,每条路连接一个或两个城市。经过一条路ei需要耗费时间ti。此外,每条路均有一个特定标识,为’L’,’O’,’V’,’E’,中的某个字母。yh从1号城市出发,前往位于n号城市的小y所在处。

为了考验yh,小y规定,yh必须按照‘L’->’O’->’V’->’E’->’L’->’O’->’V’->’E’->.... 的顺序选择路,且所走的第一条路是’L’,最后一条路是’E’,每走完一个完整的’LOVE’算是通过一次考验

在不违背小y要求的前提下,yh想花费最少的时间到达小y的所在地,同在此时间内完成最多次考验。你能帮yh算出,他最少要花多久到达城市n,完成多少次考验呢?

输入

第一行为两个整数n,m表示有n个城市,m条双向路。

第2行到第m+1行,每行有3个整数x,y,t和一个字符char,城市x,y之间有路,通过这条路花费的时间为t,这条路的特殊标志为 char。

输出

输出1行,两个整数表示yh到达城市n花费的最少时间和该时间内通过的最多次考验数,如果不能到达则输出’HOLY SHIT!’

输入示例

   L
O
V
E

输出示例

 

数据规模及约定

对于100%数据,1≤n≤1314,0≤M≤13520

题解

设置状态为 (u, t) 表示当前所在节点 u,并且刚刚经过种类为 t 的边,跑最短路。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <queue>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 1324
#define maxm 27050
#define oo (1ll << 60)
#define LL long long
int n, m, head[maxn], next[maxm], to[maxm], dist[maxm], type[maxm]; void AddEdge(int a, int b, int c, int d) {
to[++m] = b; dist[m] = c; type[m] = d; next[m] = head[a]; head[a] = m;
swap(a, b);
to[++m] = b; dist[m] = c; type[m] = d; next[m] = head[a]; head[a] = m;
return ;
} LL d[5][maxn];
int t[5][maxn];
bool vis[5][maxn];
struct Node {
int u, tp, t;
LL d;
Node() {}
Node(int _1, LL _2, int _3, int _4): u(_1), d(_2), tp(_3), t(_4) {}
bool operator < (const Node& T) const { return d != T.d ? d > T.d : t < T.t; }
} ;
priority_queue <Node> Q;
void Dijkstra(int s) {
for(int j = 0; j < 4; j++)
for(int i = 1; i <= n; i++) d[j][i] = oo;
d[4][s] = 0; Q.push(Node(s, 0, 4, 0));
while(!Q.empty()) {
Node u = Q.top(); Q.pop();
if(vis[u.tp][u.u]) continue;
vis[u.tp][u.u] = 1;
// printf("tp: %d, u: %d %lld\n", u.tp, u.u, d[u.tp][u.u]);
for(int e = head[u.u]; e; e = next[e]) if((u.tp < 4 && (u.tp + 1) % 4 == type[e]) || (u.tp == 4 && !type[e])) {
if(d[type[e]][to[e]] > d[u.tp][u.u] + dist[e]) {
d[type[e]][to[e]] = d[u.tp][u.u] + dist[e];
t[type[e]][to[e]] = t[u.tp][u.u] + (type[e] == 3);
if(!vis[type[e]][to[e]]) Q.push(Node(to[e], d[type[e]][to[e]], type[e], t[type[e]][to[e]]));
}
else if(d[type[e]][to[e]] == d[u.tp][u.u] + dist[e] && t[type[e]][to[e]] < t[u.tp][u.u] + (type[e] == 3)) {
t[type[e]][to[e]] = t[u.tp][u.u] + (type[e] == 3);
if(!vis[type[e]][to[e]]) Q.push(Node(to[e], d[type[e]][to[e]], type[e], t[type[e]][to[e]]));
}
}
}
return ;
} int main() {
n = read(); int m = read();
for(int i = 1; i <= m; i++) {
int a = read(), b = read(), c = read(), d;
char tp[2]; scanf("%s", tp);
if(tp[0] == 'L') d = 0;
if(tp[0] == 'O') d = 1;
if(tp[0] == 'V') d = 2;
if(tp[0] == 'E') d = 3;
AddEdge(a, b, c, d);
} Dijkstra(1);
if(vis[3][n]) printf("%lld %d\n", d[3][n], t[3][n]);
else puts("HOLY SHIT!"); return 0;
}

数据有点坑,比如说整张图只有一个点的智障问题。

[codevs2070]爱情之路的更多相关文章

  1. AC日记——爱情之路 codevs 2070

    2070 爱情之路  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description yh非常想念他的女朋友小y,于是他 ...

  2. 爱情之路(codevs 2070)

    题目描述 Description yh非常想念他的女朋友小y,于是他决定前往小y所在的那块大陆. 小y所在的大陆共有n个城市,m条双向路,每条路连接一个或两个城市.经过一条路ei需要耗费时间ti.此外 ...

  3. it喜爱的歌词

    1.曼丽 我们的过去我们的情义怎么能忘记  #曼丽你怎么这样忍心静静的就离去 #我很伤心从今以后不能够见到你 #只有留下你往日的情景使我常回忆 #一样的青山一样的绿水只有我和你 #曼丽可记得我们时常快 ...

  4. Python之路第一课Day2--随堂笔记

    入门知识拾遗 一.bytes类型 bytes转二进制然后转回来 msg="张杨" print(msg) print(msg.encode("utf-8")) p ...

  5. Java学习之路:不走弯路,就是捷径

    1.如何学习程序设计? JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用.有编程高手认为,JAVA也好C也好没什么分别,拿来就用.为 ...

  6. 【管理心得之三十二】PMP杂谈---------爱情必胜术

    这次一反常态,没有场景设计,我想借此文普及一下PMP是什么? 但我不知道这样枯燥的话题能否能引起你的兴趣,我不得不套用“标题党”<爱情必胜术>来博你眼球. 我真没有说谎,此文是献给那些孤身 ...

  7. 为了找到自己的路——leo锦书62

    <Leo锦书(文章1编辑)>百度已经降落阅读,今后将继续更新.免费下载:http://t.cn/RvawZEx 柯克•卡梅隆是谁呢?在中国听过这名字的人预计不多.但看下封面我们马下就会说: ...

  8. 未完成的IT路停在回车键---2014年末总结篇

    时间都去哪儿了?         一晃而过,越来越能体会到这个词的真实感.特别是过了二十岁,这种感觉越来越深刻,越来越强烈,犹如小编做公交车的时候一直向后排排倒的香樟树,还记得有首歌叫时间都哪儿了,而 ...

  9. 开始PYTHON之路

    曾经的功献给了球场酒精 曾经的激情也献给了爱情 曾经的智商用来副本求生 曾经的VB6老迈的只剩点0 曾经的SQL2000都不兼容 曾经........ 还有一些理想没有实现 还得继续在这个世界谋生 岁 ...

随机推荐

  1. wcf第2步之服务端标准配置文件

    服务端app.config <?xml version="1.0" encoding="utf-8" ?><configuration> ...

  2. Linux 的cp命令详解

    功能: 复制文件或目录说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若同时指定多个文件或目录, ...

  3. _mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h':问题的解决 mysql安装python

    在win7下安装了Python后,想安装python-MySQL,使用pip安装出现如下问题: >pip install MySQL-python _mysql.c(42) : fatal er ...

  4. 史上最全的Linux常用命令

    系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...

  5. Java 创建文件夹和文件

    String path="D://my"; File folder=new File(path); if(!folder.exists() && !folder.i ...

  6. QT 初阶 第二章 创建对话框(查找对话框实例)

    最终效果图: 该对话框由三个文件组成:finddialog.h .finddialog.cpp. main.cpp 代码+注释 /*--finddialog.h--*/ #ifndef FINDDIA ...

  7. 一个 Sql语句优化的问题- STATISTICS 统计信息

    前段时间,同事遇到一个 Sql语句的问题,一个列表分页功能响应在30 s以上,看数据库里面的数据条数,数据量也不大,相关字段的一些索引也都有,可就是慢.于是找出具体的sql 语句出来分析,分页功能主要 ...

  8. C# WinForm中将Form显示在Panel中(C#)

    信息来自:http://blog.csdn.net/renyouprince/article/details/4136176 当我们在做WinForm的程序时,总是要弹出一些窗体,但弹出窗体看起来效果 ...

  9. chain.doFilter(request,response)含义

    过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并 ...

  10. jqxTreeGrid

    基本TreeGrid样本 <!DOCTYPE html> <html lang="en"> <head> <title id=" ...