HDU-3499:Flight(SPFA+dp)
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.
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.
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
概译:共有N个城市,M行里给出某市到另一个市(单向)的机票价格(这M行未必包含所有的N个城市),然后给出起始点和终点。这期间可以有一次机票打折机会,求解最小花费。如果到达不了,输出-1。 思路:显然的图题。如果没有打折这一条件的话就是有向图的最短路径,而打折条件是典型的、在每一步操作中可选可不选的条件类型,dp处理一下。也就是我们在求解最短路的过程中加上几条dp思想的语句来记录所需结果,此处最短路用的是spfa。另外注意一下这个题中,点的给出形式为字符串,我用的是STL中的map对其进行转化处理。
代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<map>
#include<vector>
#include<climits>
using namespace std; typedef long long ll;
const long long inf=LLONG_MAX; struct node
{
int id,cost;
node(int x,int y):id(x),cost(y){}
};
int n,m,cnt;//点数、边数、在输入里出现过的城市数
ll dis[][];//dp处理的距离
bool vis[];//spfa里负责记录是否在队列中
char ch1[],ch2[];//城市1,城市2
//以下为最短路所需容器
map<string,int>mp;
vector<node>v[];
queue<int>q; void spfa(int k)//求最短路
{
for(int i=;i<=n;i++)
dis[i][]=dis[i][]=inf;
dis[k][]=dis[k][]=;
//dis[i][0]代表到达i点时以前打过一次折的最小花费,即dis[城市2][0]就是结果,dis[i][1]是到达i点之前一直不打折的花费
memset(vis,false,sizeof(vis));
q.push(k);
while(!q.empty())
{
int t=q.front();q.pop();
vis[t]=false;
for(int i=;i<v[t].size();i++)
{
node e=v[t][i];
bool flag=false;
if(dis[e.id][]>dis[t][]+e.cost)//常规操作,把dis[i][1]当成模板里的dis[i]就行……
{
flag=true;
dis[e.id][]=dis[t][]+e.cost;
}
if(dis[e.id][]>dis[t][]+e.cost||dis[e.id][]>dis[t][]+e.cost/)
{//dp,之前打了折的花费加上这次的花费,与之前一直不打折这次打折的花费,取最小值为对于这个点的打过一次折以后的最小花费
flag=true;
dis[e.id][]=min(dis[t][]+e.cost,dis[t][]+e.cost/);
}
if(flag&&!vis[e.id])//更新了花费且此点不在队列中时
{
vis[e.id]=true;
q.push(e.id);
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
//不要忘了各种清空
cnt=;
mp.clear();
for(int i=;i<=n;i++)
v[i].clear();
//建图
for(int i=;i<=m;i++)
{
int cost;//机票钱
scanf("%s%s%d",ch1,ch2,&cost);
//如果还没出现过这个城市,加进来,记录下来它的编号,简单起见第几个出现就是几了
if(!mp[ch1]) mp[ch1]=++cnt;
if(!mp[ch2]) mp[ch2]=++cnt;
v[mp[ch1]].push_back(node(mp[ch2],cost));//单向
}
scanf("%s%s",ch1,ch2);//起点终点
if(!mp[ch1]) mp[ch1]=++cnt;
if(!mp[ch2]) mp[ch2]=++cnt;
spfa(mp[ch1]);//求解
printf("%lld\n",dis[mp[ch2]][]==inf?-:dis[mp[ch2]][]);//inf代表无法到达
}
return ;
}
HDU-3499:Flight(SPFA+dp)的更多相关文章
- HDU 5236 Article(概率DP)
http://acm.hdu.edu.cn/showproblem.php?pid=5236 题意:现在有人要在文本编辑器中输入n个字符,然而这个编辑器有点问题. 在i+0.1s(i>=0)的时 ...
- 【BZOJ】1003: [ZJOI2006]物流运输trans(SPFA+DP)
http://www.lydsy.com/JudgeOnline/problem.php?id=1003 这题一开始看是不会的额,,,还是看题解了..一开始我觉得不能用最短路啥的,,看了题解发现这是d ...
- HDU 2571 命运 (简单DP)
命运 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- HDU - 3499 Flight 双向SPFA+枚举中间边
Flight Recently, Shua Shua had a big quarrel with his GF. He is so upset that he decides to take a t ...
- PAT 甲级 1087 All Roads Lead to Rome(SPFA+DP)
题目链接 All Roads Lead to Rome 题目大意:求符合题意(三关键字)的最短路.并且算出路程最短的路径有几条. 思路:求最短路并不难,SPFA即可,关键是求总路程最短的路径条数. 我 ...
- hdu 4625 Dice(概率DP)
Dice Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- hdu 4826 Labyrinth(简单dp)
Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向上向下向 ...
- hdu 2571 命运(水DP)
题意: M*N的grid,每个格上有一个整数. 小明从左上角(1,1)打算走到右下角(M,N). 每次可以向下走一格,或向右走一格,或向右走到当前所在列的倍数的列的位置上.即:若当前位置是(i,j), ...
- HDU 4745---Two Rabbits(区间DP)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4745 题意:两只兔子,在n块围成一个环形的石头上跳跃,每块石头有一个权值ai,一只从左往右 ...
随机推荐
- 修改ubuntu14.04命令行启动
方法1: 原来要想默认不进入xwindows,只需编辑文件”/etc/default/grub”, 把 GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash” 改成GRUB ...
- IDEA 设置代码行宽度
1.在File->settings->Editor->Code Style 2.在File->settings->Editor->Code Style->XM ...
- j2ee项目Java代码性能优化要点(抄书)
亚信联创科技出版的. 1.与log4j有关的性能问题 Logger对象的标准定义方式: private static transient Logger log=Logger.getLogger(cre ...
- 【译】在ES6中如何优雅的使用Arguments和Parameters
原文地址:how-to-use-arguments-and-parameters-in-ecmascript-6 ES6是最新版本的ECMAScript标准,而且显著的改善了JS里的参数处理.我们现在 ...
- bytearray类型
bytearray类型是python中的二进制数组类型,返回一个字节数组. byte=bytearray(str,encoding,error) str:待转化的字符串,若该值为字符串,则encodi ...
- 基类的两个派生类再派生一个派生类 用virtual避免二义性
class vehicle{ int MaxSpeed; int Weight;public: vehicle(int maxspeed, int weight) :MaxSpeed(maxspeed ...
- PowerShell自动部署网站—(1)、安装IIS[添加角色和角色服务]
#------添加角色/角色服务------ Import-Module servermanager $features = get-windowsfeature Net-*,Telnet-*,Web ...
- zk 10之:Curator之三:服务的注册及发现
Service Discovery 我们通常在调用服务的时候,需要知道服务的地址,端口,或者其他一些信息,通常情况下,我们是把他们写到程序里面,但是随着服务越来越多,维护起来也越来越费劲,更重要的是, ...
- Programming With Objective-C---- Introduction ---- Objective-C 学习(一)
About Objective-C Objective-C is the primary programming language you use when writing software for ...
- textarea的style="resize:none;"
<textarea class="form-control" id="gryj" rows="3" maxlength="3 ...