【基礎練習】【拓撲排序】codevs3294 車站分級題解
題目來源:NOIP2013 普及第四題
一條單向的鐵路線上,依次有編號為1, 2, …, n的n個火車站。每一個火車站都有一個級別,最低為1級。現有若幹趟車次在這條線路上行駛。每一趟都滿足例如以下要求:假設這趟車次停靠了火車站x。則始發站、終點站之間全部級別大於等於火車站x的都必須停靠。
(註意:起始站和終點站自然也算作事先已知須要停靠的網站)
比如,下表是5趟車次的執行情況。當中。前4趟車次均滿足要求,而第5趟車次因為停靠了3號火車站(2級)卻未停靠途經的6號火車站(亦為2級)而不滿足要求。
現有m趟車次的執行情況(所有滿足要求),試推算這n個火車站至少分為幾個不同的級別。
第一行包括2個正整數n, m,用一個空格隔開。
第i+1行(1≤i≤m)中,首先是一個正整數s_i(2≤s_i≤n),表示第i趟車次有s_i個停靠站;接下來有s_i個正整數,表示全部停靠站的編號,從小到大排列。每兩個數之間用一個空格隔開。輸入保證全部的車次都滿足要求。
輸出僅僅有一行,包括一個正整數,即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 1]
2
[Sample 2]
3
對於20%的數據。1 ≤ n, m ≤ 10;
對於50%的數據,1 ≤ n, m ≤ 100。
對於100%的數據。1 ≤ n, m ≤ 1000。
基本思路是 對於每條線路 他中間的點 沒有經過的級別一定嚴格小於經過的級別 因此每一個沒有經過的點指向每一個經過的點連接一條邊 這樣構建一張圖 比較稠密 在拓撲排序就可以 拓撲排序出來幾層就分幾級
寫的代碼參考了黃學長的 因此基本一樣 但第一次嘗試全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 車站分級題解