L3-014. 周游世界

时间限制
200 ms

内存限制
65536 kB

代码长度限制
8000 B

判题程序
Standard

作者
陈越

周游世界是件浪漫事,但规划旅行路线就不一定了…… 全世界有成千上万条航线、铁路线、大巴线,令人眼花缭乱。所以旅行社会选择部分运输公司组成联盟,每家公司提供一条线路,然后帮助客户规划由联盟内企业支持的旅行路线。本题就要求你帮旅行社实现一个自动规划路线的程序,使得对任何给定的起点和终点,可以找出最顺畅的路线。所谓“最顺畅”,首先是指中途经停站最少;如果经停站一样多,则取需要换乘线路次数最少的路线。

输入格式:

输入在第一行给出一个正整数N(<= 100),即联盟公司的数量。接下来有N行,第i行(i=1, ..., N)描述了第i家公司所提供的线路。格式为:

M S[1] S[2] ... S[M]

其中M(<= 100)是经停站的数量,S[i](i=1, ..., M)是经停站的编号(由4位0-9的数字组成)。这里假设每条线路都是简单的一条可以双向运行的链路,并且输入保证是按照正确的经停顺序给出的 —— 也就是说,任意一对相邻的S[i]和S[i+1](i=1, ..., M-1)之间都不存在其他经停站点。我们称相邻站点之间的线路为一个运营区间,每个运营区间只承包给一家公司。环线是有可能存在的,但不会不经停任何中间站点就从出发地回到出发地。当然,不同公司的线路是可能在某些站点有交叉的,这些站点就是客户的换乘点,我们假设任意换乘点涉及的不同公司的线路都不超过5条。

在描述了联盟线路之后,题目将给出一个正整数K(<= 10),随后K行,每行给出一位客户的需求,即始发地的编号和目的地的编号,中间以一空格分隔。

输出格式:

处理每一位客户的需求。如果没有现成的线路可以使其到达目的地,就在一行中输出“Sorry, no line is available.”;如果目的地可达,则首先在一行中输出最顺畅路线的经停站数量(始发地和目的地不包括在内),然后按下列格式给出旅行路线:

Go by the line of company #X1 from S1 to S2.
Go by the line of company #X2 from S2 to S3.
......

其中Xi是线路承包公司的编号,Si是经停站的编号。但必须只输出始发地、换乘点和目的地,不能输出中间的经停站。题目保证满足要求的路线是唯一的。

输入样例:

4
7 1001 3212 1003 1204 1005 1306 7797
9 9988 2333 1204 2006 2005 2004 2003 2302 2001
13 3011 3812 3013 3001 1306 3003 2333 3066 3212 3008 2302 3010 3011
4 6666 8432 4011 1306
4
3011 3013
6666 2001
2004 3001
2222 6666

输出样例:

2
Go by the line of company #3 from 3011 to 3013.
10
Go by the line of company #4 from 6666 to 1306.
Go by the line of company #3 from 1306 to 2302.
Go by the line of company #2 from 2302 to 2001.
6
Go by the line of company #2 from 2004 to 1204.
Go by the line of company #1 from 1204 to 1306.
Go by the line of company #3 from 1306 to 3001.
Sorry, no line is available.

思路分析:

DFS遍历图,选择点数最少的路径,若点数相同则比较换乘次数,换乘次数可根据线路编号的变化来计算,设置一个line[MAX][MAX]数组保存i j点之间的线路编号。

确定换乘次数:DFS遍历时将线路暂存在temp中(注意是顺序存的,不是倒序,与最短路径中的区别开,不要混淆)。设一个preline保存前一条线路区间的编号,如果当前区间的line与preline不同,则需换乘。同时要更新preline为line。最后输出的时候方法类似,但是需要加一个pretran来暂存上一个换乘点,因为需要同时输出本次和上次的换乘车站,同时要注意最后不要忘记输出终点站。

题解:

#include <stdio.h>
#include <vector>
#define MAX 10000
using namespace std;vector<int>g[MAX], temp ,path;
int n, m, k, s, e, line[MAX][MAX] = {0}, minnum = MAX+1, mintrnum = MAX+1;
bool judge[MAX] = {false}, judgeis;int compute(vector<int> a){int ans = 0, pre = a[a.size()-1], next, preline = -1;for(int i = a.size()-2; i >= 0; i--){next = a[i];if(line[pre][next] != preline) ans++;preline = line[pre][next];pre = next;}return ans;
}void DFS(int s){if(s == e){temp.push_back(s);judge[s] = true;int temptrnum = compute(temp);if(temp.size() < minnum || (temp.size() == minnum && mintrnum > temptrnum)){minnum = temp.size();mintrnum = temptrnum;path = temp;judgeis = true;}temp.pop_back();judge[s] = false;return;}temp.push_back(s);judge[s] = true;for(int i = 0; i < g[s].size(); i++){if(!judge[g[s][i]]) DFS(g[s][i]);}temp.pop_back();judge[s] = false;
}int main(){scanf("%d", &n);for(int i = 1; i <= n; i++){int v1, v2;scanf("%d %d", &m, &v1);m--;while(m--){scanf("%d", &v2);g[v1].push_back(v2);g[v2].push_back(v1);line[v1][v2] = line[v2][v1] = i;v1 = v2;}}scanf("%d", &k);while(k--){scanf("%d %d", &s, &e);minnum = MAX+1, mintrnum = MAX+1, judgeis = false;DFS(s);if(judgeis){printf("%d\n", path.size()-1);int pre = path[0], next, preline = line[pre][path[1]], pretran = pre;for(int i = 1; i < path.size(); i++){next = path[i];if(preline != line[pre][next]){printf("Go by the line of company #%d from %04d to %04d.\n", preline, pretran, pre);pretran = pre;}preline = line[pre][next];pre = next;}printf("Go by the line of company #%d from %04d to %04d.\n", preline, pretran, e);}else printf("Sorry, no line is available.\n");}return 0;
}

L3-014. 周游世界相关推荐

  1. 带你「周游世界」的 MODNet 算法

    来源 | Jack Cui 责编 | 晋兆雨 头图 | CSDN下载自视觉中国 最近又有一个算法火了,不知道你们看到没?直接看效果! 效果这么稳定的人像 Image Matting 算法真的不多,并且 ...

  2. 从明天起,做一个幸福的人。喂马,砍柴,周游世界

    从明天起,做一个幸福的人.喂马,砍柴,周游世界 转载于:https://blog.51cto.com/maitianli/1355347

  3. 好想找一个灵魂伴侣,然后带着他一起周游世界,会实现吗?

    1.很遗憾,这个世界上没有所谓高度契合的灵魂伴侣. 2.人谈恋爱,特别是初恋的时候,都是灵魂伴侣,但想一辈子都是,不现实. 3.小时候看琼瑶剧,那里的男女都是灵魂伴侣,永远不愁吃穿,没有凡人的苦恼.但 ...

  4. CCCC-GPLT L3-014. 周游世界 团体程序设计天梯赛

    周游世界是件浪漫事,但规划旅行路线就不一定了-- 全世界有成千上万条航线.铁路线.大巴线,令人眼花缭乱.所以旅行社会选择部分运输公司组成联盟,每家公司提供一条线路,然后帮助客户规划由联盟内企业支持的旅 ...

  5. 旅游新时尚:点点鼠标就可“周游世界”

    网上开店.网上社交.网上工作--如今,旅游也可以在网上实现了--足不出户,面对电脑,点点鼠标,既可以欣赏大好河山,也可以"周游世界". 网络旅游是什么? 从事媒体工作的孙×××,不 ...

  6. 【CCCC】L3-014 周游世界 (30分),,DFS搜索最短路,路径打印

    problem L3-014 周游世界 (30分) 周游世界是件浪漫事,但规划旅行路线就不一定了-- 全世界有成千上万条航线.铁路线.大巴线,令人眼花缭乱.所以旅行社会选择部分运输公司组成联盟,每家公 ...

  7. 打工人的「周游世界」,AI算法帮你实现,泪目!

    一.前言 大家好,我是 Jack . 最近又有一个算法火了,不知道你们看到没?直接看效果! 打工人的「周游世界」,AI 算法帮你实现. 效果这么稳定的人像 Image Matting算法真的不多,并且 ...

  8. 从今天起,做一个闲人,喂马、劈柴,周游世界。。。

    又到周五了,时间过的真快,看到身边的人每天都忙忙碌碌的,今天我们聊一聊闲人的话题. 闲人,一般通常理解就是闲置,空闲,无所事事,与忙人整天忙于各种事情对照. 与闲人相比,大家似乎愿意做一个忙人,至少看 ...

  9. 同学,其实你可以不用周游世界……

    (一) 昨天和一个朋友聊天,她说她要去听一个讲座,讲演者是她崇拜的人,因为她想到既然世界末日要来了,不如放下工作,周游世界,写书-- 我一听到"周游世界"一词,差一点没有喷出自己喜 ...

  10. 从今天开始喂马、劈柴,周游世界

    从今天开始喂马.劈柴,周游世界 总感觉这辈子是给父母老婆孩子活的,总想着35岁以后能做自己想做的事儿,总梦想着自己能骑马仗剑走天涯,来几次想走就走的旅行. 可现实总会随时给你敲个警钟,每当你心生向往的 ...

最新文章

  1. vc++向txt文件中写入数据,追加数据
  2. 智慧AI组对于激光投影的检测方案
  3. [TJOI2018]智力竞赛 (匈牙利)
  4. windows安装zabbix客户端
  5. 这个 HTTP 实战项目,帮你理清 Go 网络编程的底层逻辑
  6. android启动activity的详细过程
  7. linux开机脚本文件下载,linux 开机启动脚本
  8. CentOS上的安装和配置MYSQL 支持 INNODB引擎
  9. 以太坊 ERC EIP是什么
  10. 小马Win7永久激活工具—OemY3.1 NT6通用完美激活
  11. WPF调用 ECharts 显示图表
  12. DM_SQL建表语法
  13. 表达式类型错误oracle,这个语句报pls_00382 表达式类型错误 求问为什么。
  14. windows局域网共享文件
  15. 量化指标公式源码_五行量化副图指标 源码 通达信
  16. DateTimePicker:jQuery日期和时间插件
  17. 在网上下的PPT模板打不开
  18. dns服务器响应配置,没有配置的dns服务器响应
  19. 教你用几何画板绘制网格
  20. Leetcode练习题:复杂数据结构

热门文章

  1. java中的multipart_基于JAVA中Jersey处理Http协议中的Multipart的详解
  2. 零基础学习CSS---05.CSS背景属性详解
  3. 易语言新手入门教程第四课 - 简单模仿QQ登录窗口
  4. 异常(Outlier)检测算法综述
  5. finetune踩坑
  6. Httpd服务进阶知识-HTTP协议详解
  7. 置换矩阵(P)的逆是其转置(T)
  8. 企业如何实现便捷化文档管理
  9. 在Node服务器中运行html文件
  10. redis/nginx/dubbo/solr 中间件小总结