1. 程式人生 > >【基礎練習】【拓撲排序】codevs3294 車站分級題解

【基礎練習】【拓撲排序】codevs3294 車站分級題解

線上 inpu tom code spa bre 必須 處理 snippets

題目來源:NOIP2013 普及第四題



題目描寫敘述 Description

一條單向的鐵路線上,依次有編號為1, 2, …, n的n個火車站。每一個火車站都有一個級別,最低為1級。現有若幹趟車次在這條線路上行駛。每一趟都滿足例如以下要求:假設這趟車次停靠了火車站x。則始發站、終點站之間全部級別大於等於火車站x的都必須停靠。

(註意:起始站和終點站自然也算作事先已知須要停靠的網站)
比如,下表是5趟車次的執行情況。當中。前4趟車次均滿足要求,而第5趟車次因為停靠了3號火車站(2級)卻未停靠途經的6號火車站(亦為2級)而不滿足要求。

技術分享

現有m趟車次的執行情況(所有滿足要求),試推算這n個火車站至少分為幾個不同的級別。

輸入描寫敘述 Input Description

第一行包括2個正整數n, m,用一個空格隔開。


第i+1行(1≤i≤m)中,首先是一個正整數s_i(2≤s_i≤n),表示第i趟車次有s_i個停靠站;接下來有s_i個正整數,表示全部停靠站的編號,從小到大排列。每兩個數之間用一個空格隔開。輸入保證全部的車次都滿足要求。

輸出描寫敘述 Output Description

輸出僅僅有一行,包括一個正整數,即n個火車站最少劃分的級別數。

例子輸入 Sample Input

[Sample 1]
9 2
4 1 3 5 6
3 3 5 6
[Sample 2]
9 3
4 1 3 5 6
3 3 5 6
3 1 5 9

例子輸出 Sample Output

[Sample 1]
2
[Sample 2]
3

數據範圍及提示 Data Size & Hint

對於20%的數據。1 ≤ n, m ≤ 10;
對於50%的數據,1 ≤ n, m ≤ 100。
對於100%的數據。1 ≤ n, m ≤ 1000。

這道題目李晨說一看就是拓撲 我看了半天沒看出來看了別人說才想明確⊙﹏⊙b汗 羞愧啊

基本思路是 對於每條線路 他中間的點 沒有經過的級別一定嚴格小於經過的級別 因此每一個沒有經過的點指向每一個經過的點連接一條邊 這樣構建一張圖 比較稠密 在拓撲排序就可以 拓撲排序出來幾層就分幾級

寫的代碼參考了黃學長的 因此基本一樣 但第一次嘗試全WA 由於ans=0放錯了位置 改動後WA了一半 事實上原因在這裏(錯誤的代碼):

while (1)
	{
		int top=0;
		for (int i=1;i<=n;i++)
		{
			if (!r[i])
			{
				r[i]=-1;
				top++;
				for (int j=1;j<=n;j++) 
				  if (e[i][j])
				  {
				  	e[i][j]=0;
				  	r[j]--;//maybe it is 0 now! 這裏有可能產生了新的入度為0的點。而這個點本應該是下一層排序出來的
				  }
			}
		}
		if (!top) break;
		ans++;

也就是說 不能找到一個點處理一個 應該存起來集中處理


那麽放代碼



————————————————無責任切割線————————————————

由於是準備NOIP,圖論的專題基本就到此為止了,當然之後也會穿插一些練習。

Tarjan縮點沒學會,李晨說不要學了,於是臨時放下。LCA可能還是要看一下,有時間還要嘗試線段樹平衡樹(斜角四十五度仰望天空……)

下一個模塊開數學吧 歐拉函數 逆元 組合數 這些都要學的

不知不覺博客的詩句積累了好多···整理了一下真是驚人啊

六一快樂盡管已經過去了 高考加油 準備搬樓 文化課也要加油 努力考清華【= =



——已而得舟,避諸洲,出北海。然後渡揚子江。入蘇州洋,輾轉四明、天臺。以至於永嘉。


【基礎練習】【拓撲排序】codevs3294 車站分級題解