PAT甲级1111. Online Map

题意:

输入我们当前的位置和目的地,一个在线地图可以推荐几条路径。现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的。确保任何请求存在路径。

输入规格:

每个输入文件包含一个测试用例。对于每种情况,

第一行给出两个正整数N(2 <= N <= 500),M分别是地图上街道交叉路口的总数和街道数。然后M行跟随,每个描述一个街道的格式:

V1 V2单程长度时间

其中V1和V2是街道两端的索引(从0到N-1);一-

方式是1,如果街道从V1到V2是单向的,或者如果没有,则为0;长度是街道的长度;时间是通过街道的时间。

最后给出一对源和目的地。

输出规格:

对于每种情况,首先打印距离为D的源到目的地的最短路径,格式如下:

距离= D:源 - > v1 - > ... - >目的地

然后在下一行打印总时间最快的路径T:

时间= T:源 - > w1 - > ... - >目的地

如果最短路径不唯一,则输出最短路径中最快的路径,这被保证是唯一的。如果最快的路径不是唯一的,

输出通过最少交叉路口的路口,这被保证是唯一的。

如果最短和最快的路径相同,请以以下格式打印一行:

距离= D;时间= T:源 - > u1 - > ... - >目的地

思路:

Dijkstra + dfs.写了一个小时,有点慢。

ac代码:

C++

// pat1111.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" #include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
#include<stdio.h>
#include<map>
#include<cmath>
#include<unordered_map>
#include<unordered_set> using namespace std; int n, m;
int starting, destination;
int mymap[501][501];
int mytime[501][501];
int visit[501];
int len[501];
int vec[501];
int disway[501];
int timeway[501];
int temp[501];
int short_time = -1;
int time_len = -1;
int dlen = 0,time_dis = 0; void Dijkstra()
{
int now = -1; memset(visit, 0, sizeof(visit));
memset(len, -1, sizeof(len));
len[starting] = 0;
while (1)
{
now = -1;
for (int i = 0; i < n; i++)
{
if (!visit[i] && len[i] != -1 && (now == -1 || len[i] < len[now])) now = i;
}
if (now == -1) break;
visit[now] = 1;
for (int i = 0; i < n; i++)
{
if (!visit[i] && mymap[now][i] && (len[i] == -1 || mymap[now][i] + len[now] < len[i] ))
len[i] = mymap[now][i] + len[now];
}
} memset(vec, -1, sizeof(vec));
memset(visit, 0, sizeof(visit));
vec[starting] = 0;
while (1)
{
now = -1;
for (int i = 0; i < n; i++)
{
if (!visit[i] && vec[i] != -1 && (now == -1 || vec[i] < vec[now])) now = i;
}
if (now == -1) break;
visit[now] = 1;
for (int i = 0; i < n; i++)
{
if (!visit[i] && mytime[now][i] && (vec[i] == -1 ||mytime[now][i] + vec[now] < vec[i]))
vec[i] = mytime[now][i] + vec[now];
}
} } void dfs(int cur, int dis, int time, int pos)
{
if (dis > len[destination] && time > vec[destination]) return;
if (dis == len[destination] && cur == destination)
{
if (short_time == -1 || time < short_time)
{
short_time = time;
dlen = pos;
for (int i = 0; i < pos; i++)
disway[i] = temp[i];
}
}
if (time == vec[destination] && cur == destination)
{
if (time_len == -1 || pos < time_len)
{
time_len = pos;
time_dis = dis;
for (int i = 0; i < pos; i++)
timeway[i] = temp[i];
}
} for (int i = 0; i < n; i++)
{
if (!visit[i] && mymap[cur][i])
{
temp[pos] = i;
dfs(i, dis + mymap[cur][i], time + mytime[cur][i], pos + 1);
}
} } int main()
{
//input
scanf("%d %d", &n, &m);
int v1, v2, is_one, l, t;
for (int i = 0; i < m; i++)
{
scanf("%d %d %d %d %d", &v1, &v2, &is_one, &l, &t);
if (is_one)
{
mymap[v1][v2] = l;
mytime[v1][v2] = t;
}
else
{
mymap[v1][v2] = mymap[v2][v1] = l;
mytime[v1][v2] = mytime[v2][v1] = t;
}
}
scanf("%d %d", &starting, &destination); Dijkstra(); memset(visit, 0, sizeof(visit));
//temp[0] = starting;
dfs(starting,0,0,0); if (time_dis == len[destination] && short_time == vec[destination])
{
printf("Distance = %d; Time = %d: %d", time_dis, short_time,starting);
// -> 2 -> 5"
for (int i = 0; i < time_len; i++)
printf(" -> %d", timeway[i]);
printf("\n");
}
else
{
printf("Distance = %d: %d", len[destination], starting);
for (int i = 0; i < dlen; i++)
printf(" -> %d", disway[i]);
printf("\n"); printf("Time = %d: %d", vec[destination], starting);
for (int i = 0; i < time_len; i++)
printf(" -> %d", timeway[i]);
printf("\n");
} return 0;
}

PAT甲级1111. Online Map的更多相关文章

  1. PAT甲级——1111 Online Map (单源最短路经的Dijkstra算法、priority_queue的使用)

    本文章同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90041078   1111 Online Map (30 分) ...

  2. PAT甲级1131. Subway Map

    PAT甲级1131. Subway Map 题意: 在大城市,地铁系统对访客总是看起来很复杂.给你一些感觉,下图显示了北京地铁的地图.现在你应该帮助人们掌握你的电脑技能!鉴于您的用户的起始位置,您的任 ...

  3. PAT甲级——A1131 Subway Map【30】

    In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...

  4. PAT甲级1131 Subway Map【dfs】【输出方案】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805347523346432 题意: 告诉你一个地铁线路图,站点都是 ...

  5. PAT甲级——1131 Subway Map (30 分)

    可以转到我的CSDN查看同样的文章https://blog.csdn.net/weixin_44385565/article/details/89003683 1131 Subway Map (30  ...

  6. PAT甲级——A1111 Online Map【30】

    Input our current position and a destination, an online map can recommend several paths. Now your jo ...

  7. PAT Advanced 1111 Online Map (30) [Dijkstra算法 + DFS]

    题目 Input our current position and a destination, an online map can recommend several paths. Now your ...

  8. PAT 1111 Online Map[Dijkstra][dfs]

    1111 Online Map(30 分) Input our current position and a destination, an online map can recommend seve ...

  9. PAT甲级题解(慢慢刷中)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...

随机推荐

  1. [how to]HBase Snapshots原理与使用

    1.简介 Snapshots即快照的意思,作用于表上.在对于表做快照的时候不会造成文件的拷贝,如不会对HFile文件进行拷贝而是以链接的方式链接到元表的HFile上.可以说它是一种元数据的集合,可以快 ...

  2. Centos中查询目录中内容命名ls

    首先解释下这块, root代表当前登录用户,localhost代表主机名, ~代表当前主机目录,  #代表用户权限   #表示超级用户,$表示普通用户: 查询目录中内容命令 ls  (list缩写) ...

  3. 使用T-SQL导入多个文件数据到SQL Server中

    在我们的工作中,经常需要连续输入多个文件的数据到SQL Server的表中,有时需要从相同或者不同的目录中,同时将文件中的数据倒入.在这篇文章中,我们将讨论如何同时把一个目录中的文件的数据倒入到SQL ...

  4. SQL中format()函数对应的格式

    http://www.cnbeta.com/articles/tech/632057.htm

  5. 001 python入门工具准备

    一:准备 1.python官网 https://www.python.org/ 2.使用开发工具Pycharm 3.使用版本 使用2.7.13 4.安装 5.安装pycharm http://www. ...

  6. hdoj2546 饭卡(DP,01背包)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2546 思路 首先要判断卡里的钱是不是大于等于5元,如果不足5元,直接输出余额:如果大于等于5元,则先留 ...

  7. CentOS 升级Python3.X和pip3

    目的:实现python3 and python2 共存,pip2 and pip3共存 一.安装依赖 yum install openssl-devel -y yum install zlib-dev ...

  8. java8的几种常用用法

    1. 如果接口的返回值有可能是null,请用Optional封装 public Optional<User> getUser() { return Optional.ofNullable( ...

  9. 创建NuGet包

    创建NuGet包 在创建一个NuGet包之前我们应该先创建一个以.nuspec为后缀的xml清单文件,这个清单文件描述了包的内容,在安装NuGet包的过程中这个清单文件扮演者很重要的角色.实际上它的作 ...

  10. UWP入门——应用数据和设置

    数据有两个基本的分类,应用数据和用户数据,而用户数据则为由用户拥有的数据,如文档,音乐或电子邮件等,下面将大致的介绍一下应用数据的基本操作. 应用数据:应用数据包含APP的状态信息(如运行时状态,用户 ...