还是《吝啬的国度》,研读了别人的较为高效的代码,无论是时间开销,还是空间开销都要小很多啊,截图为证:

我的所有运行:
52ms的是我参照别人的写的代码,时间开销比我的小将近一半,内存开销仅有我的五分之一。
不过,我自己又将他的改进了一下,虽然内存稍稍大了点,但时间开销为40ms,排名第一啊,哈哈!
WrongAnswer那次是因为忘了在递归中标记start,RuntimeError那次是为了调试时查看数组内容,就把数组开了100,结果调试完忘了改回来,直接提交了,数组越界,唉...
题目中要求从起始城市出发,输出经过每个城市时,之前的那个城市的编号。这样,相邻两个城市之间的关系实质上已经表示出来了,也就是说,存放之前城市编号的那个数组,存储了一个有向图,如下图所示:
输入的测试数据为:
10 1
8 10
10 3
3 7
10 4
1 9
1 8
8 6
1 2
9 5

红色箭头建立的的图,即为数组中存放之前城市编号所建立的有向图。
按照这种思路建立有向图,需要解决箭头方向的问题,即确定哪个城市离出发城市更近。这里有两种方法:
(一),建图的过程中,不管箭头方向,在整个图建立完成之后,从出发城市开始调整箭头方向。
(二),建图的过程中,根据出发城市的位置调整箭头方向,整个图建立完成时,也就是一个正确的有向图。

思路(一)也就是高人的思路,代码如下:
#include <stdio.h>
#include <memory.h>int map[100005];void Adjust(int currentCity)
{int priorCity = map[currentCity];if (priorCity != 0){Adjust(priorCity);map[priorCity] = currentCity;}
}int main()
{int i, testNum, cityNum, startCity, cityA, cityB;scanf("%d", &testNum);while (testNum-- != 0){scanf("%d%d", &cityNum, &startCity);memset(map, 0, sizeof(int)*cityNum + 1);for (i = 1; i < cityNum; i++){scanf("%d%d", &cityA, &cityB);if (map[cityB] == 0){map[cityB] = cityA;}else{Adjust(cityA);map[cityA] = cityB;}}Adjust(startCity);map[startCity] = - 1;for (i = 1; i < cityNum; i++){printf("%d ", map[i]);}printf("%d\n", map[i]);}return 0;
}

思路(二)是我自己的,因为我发现不考虑方向建立图时,会出现方向的多次调整,影响效率,所以我就想在建立图的过程中就考虑方向,代码如下:
#include <stdio.h>
#include <memory.h>int map[100005];
bool flag[100005];void AdjustIncludeStart(int currentCity)
{int priorCity = map[currentCity];if (priorCity != 0){AdjustIncludeStart(priorCity);map[priorCity] = currentCity;flag[priorCity] = true;}
}void AdjustExcludeStart(int currentCity)
{int priorCity = map[currentCity];if (priorCity != 0){AdjustExcludeStart(priorCity);map[priorCity] = currentCity;}
}int main()
{int i, testNum, cityNum, startCity, cityA, cityB;scanf("%d", &testNum);while (testNum-- != 0){scanf("%d%d", &cityNum, &startCity);memset(map, 0, sizeof(int)*cityNum + 1);memset(flag, false, sizeof(bool)*cityNum + 1);map[startCity] = - 1;flag[startCity] = true;for (i = 1; i < cityNum; i++){scanf("%d%d", &cityA, &cityB);if (flag[cityA]){if (map[cityB] != 0){AdjustIncludeStart(cityB);}map[cityB] = cityA;flag[cityB] = true;}else if (flag[cityB]){if (map[cityA] != 0){AdjustIncludeStart(cityA);}map[cityA] = cityB;flag[cityA] = true;}else{if (map[cityB] == 0){map[cityB] = cityA;}else{AdjustExcludeStart(cityA);map[cityA] = cityB;}}}for (i = 1; i < cityNum; i++){printf("%d ", map[i]);}printf("%d\n", map[i]);}return 0;
}

NYOJ 20 吝啬的国度 续相关推荐

  1. NYOJ 20 吝啬的国度(深搜)

    描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设 ...

  2. NYOJ 20 吝啬的国度 广度优先搜索

    吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有 ...

  3. NYOJ 20 吝啬的国度 (搜索)

    吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有 ...

  4. NYOJ 20 吝啬的国度(深搜)

    描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设 ...

  5. NYOJ 20 吝啬的国度

    吝啬的国度 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市 ...

  6. 《图论》— NYOJ 20 吝啬的国度

    吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有 ...

  7. 题目20: 吝啬的国度

    吝啬的国度 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市 ...

  8. NOJ 20 吝啬的国度

    开始做深搜的题,这是一种比较常见的递归,就是直接看去的点是从那来的,标记一下避免重复搜. 深搜的注意个人认为,1,要在一定范围内一般是在递归在1e4的范围内: 2,就是要注意标记,不然也可能导致超时的 ...

  9. 小白算法练习 NYOJ 吝啬的国度 dfs+邻接表

    吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有 ...

最新文章

  1. ffmpeg与x264有什么区别?
  2. hive olap 数据仓库_数据仓库系统的实现和使用(含OLAP重点讲解)
  3. 求H21时的仿射变换要参考当前坐标系
  4. 快点来白嫖!黑马培训java多长时间
  5. 士兵杀敌(三)_RMQ(区间最值查询)
  6. 使用 ngrok(小米球)实现内网穿透映像到外网访问项目
  7. php dht爬虫,利用DHT网络,爬取bt种子。
  8. BOOST 升压电路调试笔记
  9. 总结安卓应用市场App首发活动规则
  10. 如何构建可出售的Pagewiz登陆页面模板
  11. Excel中ROUND、ROUNDUP、ROUNDDOWN函数详解
  12. ARMv8-A笔记一 ARM-A系列处理器介绍
  13. 京东数据分析工具,同行商家数据快速查看对比
  14. 台达变频器vfb—d参数表_台达DPS
  15. 电脑文件和百度网盘如何随时随地备份?
  16. python面试题解析(前端、框架和其他)
  17. 汉字unicode码表范围和常用汉字unicode码
  18. Elasticsearch宝典:从ELK到Elastic Stack
  19. linux开启启动服务的顺序,SUSE服务启动顺序
  20. LaTex安装与更新

热门文章

  1. uni app中使用图表
  2. C语言——将数字和数字字符输入给char型变量会如何?
  3. 用VS2015开发Linux程序详细教程-配置篇
  4. 树(2021.7.11晚)
  5. canvas径向渐变详解
  6. Qt学习之安装过程中各种问题的解决
  7. 不同计算机的操作码完全相同,2012年计算机一级考试B试题及答案二
  8. 网友爆料奇葩leader:日报要精确到0.5小时,每晚检查!每周写周计划,评审ABCD等级,午休不许刷手机、看视频、玩游戏!...
  9. 四、PHP处理字符串常用函数
  10. 同花顺程序交易接口实现类