NYOJ 20 吝啬的国度
转自http://blog.csdn.net/code_pang/article/details/7723189
DFS是第一步就想到的,常规做法。
下面贴出的代码- - 用的技巧真是~~棒极了!!!
题目中要求从起始城市出发,输出经过每个城市时,之前的那个城市的编号。这样,相邻两个城市之间的关系实质上已经表示出来了,也就是说,存放之前城市编号的那个数组,存储了一个有向图,如下图所示:
DFS是第一步就想到的,常规做法。
下面贴出的代码- - 用的技巧真是~~棒极了!!!
题目中要求从起始城市出发,输出经过每个城市时,之前的那个城市的编号。这样,相邻两个城市之间的关系实质上已经表示出来了,也就是说,存放之前城市编号的那个数组,存储了一个有向图,如下图所示:
红色箭头建立的的图,即为数组中存放之前城市编号所建立的有向图。
按照这种思路建立有向图,需要解决箭头方向的问题,即确定哪个城市离出发城市更近。这里有两种方法:
(一),建图的过程中,不管箭头方向,在整个图建立完成之后,从出发城市开始调整箭头方向。
(二),建图的过程中,根据出发城市的位置调整箭头方向,整个图建立完成时,也就是一个正确的有向图。
高人的思路,代码如下:
#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; }