Recently, Shua Shua had a big quarrel with his GF. He is so upset that he decides to take a trip to some other city to avoid meeting her. He will travel only by air and he can go to any city if there exists a flight and it can help him reduce the total cost to the destination. There's a problem here: Shua Shua has a special credit card which can reduce half the price of a ticket ( i.e. 100 becomes 50, 99 becomes 49. The original and reduced price are both integers. ). But he can only use it once. He has no idea which flight he should choose to use the card to make the total cost least. Can you help him?

毕业了,乐乐打算去去旅行。目标城市已经定下来了,坐飞机前往。对于高中毕业生,航空公司有一项优惠政策,可以选一条线路半价,100变50,99变49。请你帮他设计一个方案,使得总花费最少。

Input

There are no more than 10 test cases. Subsequent test cases are separated by a blank line.

The first line of each test case contains two integers N and M ( 2 <= N <= 100,000

0 <= M <= 500,000 ), representing the number of cities and flights. Each of the following M lines contains "X Y D" representing a flight from city X to city Y with ticket price D ( 1 <= D <= 100,000 ). Notice that not all of the cities will appear in the list! The last line contains "S E" representing the start and end city. X, Y, S, E are all strings consisting of at most 10 alphanumeric characters.

有多组测试数据 第一行两个整数n和m,表示n个城市和m条路线 接下来m行,每行表示一条路径,从x到y,花费s元 最后一行两个字符串,表示乐乐从发的起点和目标城市。

Output

One line for each test case the least money Shua Shua have to pay. If it's impossible for him to finish the trip, just output -1. 输出最少的花费,如果不能到达输出-1

Sample Input

4 4

Harbin Beijing 500

Harbin Shanghai 1000

Beijing Chengdu 600

Shanghai Chengdu 400

Harbin Chengdu

4 0

Harbin Chengdu

Sample Output

800

-1

Hint

In the first sample, Shua Shua should use the card on the flight from

Beijing to Chengdu, making the route Harbin->Beijing->Chengdu have the

least total cost 800. In the second sample, there's no way for him to get to

Chengdu from Harbin, so -1 is needed.

样例一中: Harbin->Beijing->Chengdu ,第二条路线使用半价

题意:

题面中有中文题意

思路:

是这题的低配版本https://www.cnblogs.com/qieqiemin/p/11298508.html

这种都是套路题,在最短路dis的基础上多开一维维护使用了几次优惠的信息即可,转移就像dp一样。

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <bits/stdc++.h>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 100010;
const ll inf = 1e18;
/*** TEMPLATE CODE * * STARTS HERE ***/
struct node
{
int to;
int kk;
ll val;
node(){}
node(int tt,int ww,ll vv)
{
kk=ww;
to=tt;
val=vv;
}
bool operator < (const node & b) const
{
return val>b.val;
}
};
std::vector<node> e[maxn];
ll dis[maxn][15];
unordered_map<string,int> info;
void addedge(int a,int b,ll v)
{
e[a].push_back(node(b,0,v));
}
void init(int n)
{
for(int i=1;i<=n;++i)
{
for(int j=0;j<=2;j++)
dis[i][j]=inf;
}
}
priority_queue<node> heap;
int n;
int m,k=1;
void dijkstra(int strat)
{
init(n);
dis[strat][0]=0ll;
heap.push(node(strat,0,0ll));
node temp;
while(!heap.empty())
{
temp=heap.top();
heap.pop();
int now=temp.to;
ll val=temp.val;
int kk=temp.kk;
if(kk>k)
{
continue;
}
if(val>dis[now][kk])
continue;
for(auto x:e[now])
{
if(dis[x.to][kk]>val+x.val)
{
dis[x.to][kk]=val+x.val;
heap.push(node(x.to,kk,dis[x.to][temp.kk]));
}
if(kk<k&&dis[x.to][temp.kk+1]>val+x.val/2)
{
dis[x.to][kk+1]=val+x.val/2;
heap.push(node(x.to,kk+1,dis[x.to][temp.kk+1]));
} }
}
}
int main()
{
//freopen("D:\\code\\text\\input.txt","r",stdin);
//freopen("D:\\code\\text\\output.txt","w",stdout);
gbtb;
while(cin>>n>>m)
{
info.clear();
repd(i,1,n)
{
e[i].clear();
}
int u,v;ll c;
string str1,str2;
int cnt=0;
while(m--)
{
cin>>str1>>str2>>c;
if(info.count(str1)==0)
{
info[str1]=++cnt;
}
if(info.count(str2)==0)
{
info[str2]=++cnt;
}
u=info[str1];
v=info[str2];
addedge(u,v,c);
}
int s,t;
cin>>str1>>str2;
if(info.count(str1)==0)
{
info[str1]=++cnt;
}
if(info.count(str2)==0)
{
info[str2]=++cnt;
}
s=info[str1];
t=info[str2];
dijkstra(s);
ll ans=inf;
repd(i,0,1)
{
ans=min(ans,dis[t][i]);
}
if(ans==inf)
ans=-1;
cout<<ans<<endl;
}
return 0;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
}
else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}

Flight HDU - 3499 (分层最短路)的更多相关文章

  1. HDU 3499【最短路】

    题意: 给你一幅图,然后起点终点,然后有一个条件是可以使某条边的花费减半,求最短路的最小花费. 思路: (来自大哥) 最短路的时候多一维,途中是否有花费减半的边: 然后转移,如果上一条有减半的,这一条 ...

  2. 拯救大兵瑞恩 HDU - 4845(状压bfs || 分层最短路)

    1.状压bfs 这个状压体现在key上  我i们用把key状压一下  就能记录到一个点时 已经拥有的key的种类 ban[x1][y1][x2][y1]记录两个点之间的状态 是门 还是墙 还是啥都没有 ...

  3. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  4. ROADS POJ - 1724(分层最短路)

    就是在最短路的基础上   多加了一个时间的限制 , 多一个限制多一维就好了  记住 分层最短路要用dijistra !!! #include <iostream> #include < ...

  5. ACM-ICPC 2018 南京赛区网络预赛 L && BZOJ 2763 分层最短路

    https://nanti.jisuanke.com/t/31001 题意 可以把k条边的权值变为0,求s到t的最短路 解析  分层最短路  我们建立k+1层图 层与层之间边权为0,i 向 i+1层转 ...

  6. 分层最短路(牛客第四场)-- free

    题意: 给你边权,起点和终点,有k次机会把某条路变为0,问你最短路是多长. 思路: 分层最短路模板题.题目有点坑(卡掉了SPFA,只能用dijkstra跑的算法). #include<iostr ...

  7. 牛客练习赛47 D DongDong坐飞机 (分层最短路)

    链接:https://ac.nowcoder.com/acm/contest/904/D 来源:牛客网 DongDong坐飞机 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  8. hdu 3499 flight 【分层图】+【Dijkstra】

    <题目链接> 题目大意: 现在给你一些点,这些点之间存在一些有向边,每条边都有对应的边权,有一次机会能够使某条边的边权变为原来的1/2,求从起点到终点的最短距离. 解题分析: 分层图最短路 ...

  9. HDU 3499 Flight spfa+dp

    Flight Time Limit : 20000/10000ms (Java/Other)   Memory Limit : 65535/65535K (Java/Other) Total Subm ...

随机推荐

  1. MySQL 5.7 中文全文检索

    MySQL 5.7 中文全文检索 在 MySQL 5.7.6 之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库.从 MySQL 5.7.6 ...

  2. python导入csv文件出现SyntaxError问题分析

    python导入csv文件出现SyntaxError问题分析 先简单描述下碰到的题目,要求是写出2个print的结果 可以看到,a指向了一个列表list对象,在Python中,这样的赋值语句,其实内部 ...

  3. 使用Keepalived实现Nginx高可用

    Keepalived是一个路由软件,可以提供linux系统和linux系统上的组件的负载均衡和高可用,高可用基于VRRP(Virtual Router Redundancy Protocol,虚ip) ...

  4. 查看自身公网ip的命令

    curl ifconfig.me curl cip.cc curl ipinfo.io

  5. eve-ng

    eve-ng   eve-ng采用的是和web-iou一样的B/S模式,进步的地方是它只需拖动鼠标就可以搭建拓朴,比web-iou要直观.     此虚拟机已经集成了IOL的L2.L3以及vIOS的L ...

  6. 1.2.2 OSI参考模型 上

    一.HCNA网络技术学习指南 为了实现网络的互通及各种各样的网络应用,网络设备需要运行各种各样的协议已实现各种各样具体的功能.面对各种各样且数量繁多的功能,我们可以从网络架构的角度,引入功能分层的模型 ...

  7. 【Linux开发】linux设备驱动归纳总结(十二):简单的数码相框

    linux设备驱动归纳总结(十二):简单的数码相框 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  8. JDK下bin文件夹常见几个可执行文件

    bin目录下有很多的可执行文件: java.exe:运行Java程序,就是启动JVM,让JVM执行指定的编译后的代码: javac.exe:Java的编译器,它用于把Java源码文件(以.java后缀 ...

  9. 【转帖】2018全球公有云IaaS榜单出炉:阿里、腾讯、中国电信、金山云列前十

    2018全球公有云IaaS榜单出炉:阿里.腾讯.中国电信.金山云列前十 https://news.cnblogs.com/n/628391/ 中国电信貌似就是用的华为的技术 阿里 腾讯 华为 金山 百 ...

  10. 链表-简单练习题1-数据结构实验之链表一:顺序建立链表 SDUT2117

    Problem Description 输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据. Input 第一行输入整数的个数N:第二行依次输入每个整数. Output 输 ...