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. 查看linux服务器内存信息

    查看服务器内存信息 dmidecode|grep -P -A5 "Memory\s+Device"|grep Size [root@localhost home]# dmideco ...

  2. 形参前的&&啥意思?

    C++2011标准的 右值引用 语法 去搜索“c++11右值引用” 右值引用,当传入临时对象时可以避免一次拷贝. 右值引用.举个例子 C/C++ code   ? 1 2 3 4 5 6 7 8 // ...

  3. Centos 软连接和硬链接

    1.软链接: 建立软链接:ln -s /usr/local/node-v4.2.6-linux-x86/bin/node /usr/local/bin/node 解释:将/usr/local/node ...

  4. Python2和Python3同时安装到Windows

    上月已经把Python2安装好了,安装目录和及其下的Scripts也在安装时添加到了环境变量PATH中,可以使用python命令执行程序. 安装包:python-2.7.14.amd64.msi(没有 ...

  5. handlermethodargumentresolver

    http://www.cnblogs.com/fangjian0423/p/springMVC-request-param-analysis.html http://www.cnblogs.com/f ...

  6. 练习题 --- 写出5种css定位语法

    写出至少5种css语法(每种语法不一样)

  7. Java 中判断字符串是否为空

    public class TestString { public static void main(String[] args) { String abc = null; //先判断是否为null再判 ...

  8. Linux同步互斥(Peterson算法,生产者消费者模型)

    同步 两个或两个以上随时间变化的量在变化过程中保持一定的相对关系. 互斥 对一组并发进程,一次只有一个进程能够访问一个给定的资源或执行一个给定的功能. 互斥技术可以用于解决诸如资源争用之类的冲突,还可 ...

  9. 使用Oracle数据库,对某个表频繁更新

    使用Oracle数据库,对某个表频繁更新,查询时要联合这张表,查询速度非常慢,有什么解决办法? 一般的pc机oracle更新的效率均可达到500+/s, 可能的问题,你更新这个不会是每次都新建jdbc ...

  10. 【转】AndroidStudio升到最新版本(3.1.2)之后

    AndroidStudio升到最新版本(3.1.2)之后   暂时发现的需要大家注意的地方 1.androidstudio3无法导入moudle? 例如:我写了一个简单的项目,需要导入一个第三方的mo ...