這題真的需要花一點功夫,題目並不難懂,但是不能用直觀的方式去寫,可以上網搜尋關鍵字「find cycle in directed graph」,以及前一篇所提到的「depth-first search」(DFS)。
題目
輸入輸出格式

Sol.
我採用的作法會先將題目給的資訊整理成陣列:
whiteSet、graySet、blackSet:whiteSet:還沒判斷過的點graySet:正在判斷或已判斷的點blackSet:不用再判斷的點,有可能是因為沒有與其連接的點,或其所連接的點不屬於需要判斷的點pathArray,長度為總 node 數量,並將陣列中各項初始化為 -1,存目前已經過的點Pseudocode
建 adjacencyMatrix、selectArray
建 whiteSet、graySet、blackSet
若是沒有要判斷是否有迴圈的點就先放入blackSet,其餘在whiteSet中皆表示1
建 pathArray
int path = 0;	// 接下來這個點要放在 pathArray 中的哪
bool cycle = false;	// 是否有迴圈
bool neighbor = false;	// 有沒有與之連接的點
int i = 0;	// 現在判斷到第幾個點
//	開始判斷
While (cycle == false或i>= pointQ)
	
	如果根本就不夠判斷是否有迴圈就直接 break
	
	// 判斷這個點有沒有在blackSet中
    bool blackFlag = true;
    if遍歷完blackFlag還是true代表不用再判斷,這時就break
	
	// 不用判斷這個點就跳過繼續判斷下一個點
	if (blackSet[i] == 1)
		i++ 並continue
	
	// 如果這個點可以拿來判斷
	if (whiteSet[i] == 1 && graySet[i] == 0)
		whiteSet[i] = 0;
		graySet[i] = 1;
		pathArray[path] = i;
		path++;
	
	// 找有沒有與之相鄰的 (這個方法真的太聰明..一定要好好學起來)
	for u in range 0~nodes總數
		neighbor = false;
		// 把所有沒有neighbor的情形都判斷完後neighbor 就會是true
		neighbor = true;
		if 第u個點是在whiteSet中
			whiteSet[u] = 0;
			graySet[u] = 1;
			pathArray[path] = u;
			path++;
			i = u;
		else if 第u個點是在graySet中
			cycle = true;
		break;
	
	// 若沒有點與之相鄰了就代表這個點沒用了,把他放到 blackSet
	if neighbor == false
		whiteSet[i]、graySet[i] = 0
		blackSet[i] = 1
		//	在pathArray中刪除這格
		path--;
		pathArray[path] = -1;
		
		讓 i 回到pathArray中最後一個不為 -1 的點
	
最後輸出cycle