NYOJ 20 吝嗇的國度

轉自http://blog.csdn.net/code_pang/article/details/7723189
DFS是第一步就想到的,常規作法。
下面貼出的代碼- - 用的技巧真是~~棒極了!!!
題目中要求從起始城市出發,輸出通過每一個城市時,以前的那個城市的編號。這樣,相鄰兩個城市之間的關係實質上已經表示出來了,也就是說,存放以前城市編號的那個數組,存儲了一個有向圖,以下圖所示:
輸入的測試數據爲:
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;
}
相關文章
相關標籤/搜索