1. 程式人生 > >洛谷P1983 拓撲排序 解題報告

洛谷P1983 拓撲排序 解題報告

題目描述

一條單向的鐵路線上,依次有編號為 1, 2, …, n 的 n 個火車站。每個火車站都有一個級別,最低為 1 級。現有若干趟車次在這條線路上行駛,每一趟都滿足如下要求:如果這趟車次停靠了火車站 x,則始發站、終點站之間所有級別大於等於火車站 x 的都必須停靠。(注意:起始站和終點站自然也算作事先已知需要停靠的站點)
現有 m 趟車次的執行情況(全部滿足要求),試推算這 n 個火車站至少分為幾個不同的級別。

輸入格式:

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

輸出格式:

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

【解題報告】
在火車從起點到終點的所有站點中,停靠的站點的車站級別一定比不停靠的高,設起點為s,終點為t,如果只有一趟火車,那麼所有停靠的站的等級只需要比不停靠的站的最高值多1即可.如果再增加一趟火車,這趟火車在上一趟火車的起始點之內,那麼還要再+1,如果在起始點之外那麼就和一趟火車一樣處理,如果有n趟呢……可以想到如果拓撲排序.在起始點內不能停靠的站向可以停靠的站連有向邊,然後找到入度為0的點(沒有邊指向的點),刪除這個點和這個點所連出去的所有路徑,路徑指向的點的入度-1,當所有入度為0的點(撤銷原入度為0後入度變為0在第一輪不解決)都解決了之後,進行下一輪,進行一輪就累加一下計數器,最後輸出結果即可.這是拓撲排序的基本方法,很好理解,實在不能理解畫個圖就能理解了.還有一個問題,為什麼要多個點在同一輪進行處理呢?可以想到如果按照之前提到的方式建圖,那麼就會有多個拓撲序列,我們可以認為每一次對所有的拓撲序列的操作是等價的,直到沒有入度為0的點即可.

程式碼如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1010 

int n,m,flag[N],first,ans,vis[N];
int s,a[N],e[N][N],rudu[N],st[N],top;

void ToPo()
{
    first=1;
    while(top!=0||first)
    {
        first=0;top=0;
        for(int i=1;i<=n;i++)
        if
(!rudu[i]&&!vis[i]) st[++top]=i,vis[i]=1; for(int i=1;i<=top;i++) for(int j=1;j<=n;j++) if(e[st[i]][j]) e[st[i]][j]=0,rudu[j]--; ans++; } ans--; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { memset(flag,0,sizeof(flag)); scanf("%d",&s); for(int j=1;j<=s;j++) { scanf("%d",&a[j]); flag[a[j]]=1; } for(int j=a[1];j<=a[s];j++) { if(!flag[j]) for(int k=1;k<=s;k++) { if(!e[j][a[k]]) { e[j][a[k]]=1; rudu[a[k]]++; } } } } ToPo(); printf("%d\n",ans); return 0; }

相關推薦

P1983 排序 解題報告

題目描述 一條單向的鐵路線上,依次有編號為 1, 2, …, n 的 n 個火車站。每個火車站都有一個級別,最低為 1 級。現有若干趟車次在這條線路上行駛,每一趟都滿足如下要求:如果這趟車次停靠了火車站 x,則始發站、終點站之間所有級別大於等於火車站 x 的都

雜物_1113_排序

題目描述 John的農場在給奶牛擠奶前有很多雜務要完成,每一項雜務都需要一定的時間來完成它。比如:他們要將奶牛集合起來,將他們趕進牛棚,為奶牛清洗乳房以及一些其它工作。儘早將所有雜務完成是必要的,因為這樣才有更多時間擠出更多的牛奶。當然,有些雜務必須在另一

P1053 音樂會的等待 解題報告

print () == 音樂 記錄 的人 can HR 音樂會 P1823 音樂會的等待 題目描述 \(N\)個人正在排隊進入一個音樂會。人們等得很無聊,於是他們開始轉來轉去,想在隊伍裏尋找自己的熟人。隊列中任意兩個人\(A\)和\(B\),如果他們是相鄰或他們之間沒有人比

P2466 Sue的小球 解題報告

space 小球 維護 friend ons 描述 () 區間 都是 P2466 [SDOI2008]Sue的小球 題目描述 Sue和Sandy最近迷上了一個電腦遊戲,這個遊戲的故事發在美麗神秘並且充滿刺激的大海上,Sue有一支輕便小巧的小船。然而,Sue的目標並不是當一個

P2292 [HNOI2004] L語言 解題報告

ack .cn 現在 using 出現 memset 每次 queue word P2292 [HNOI2004] L語言 題目描述 標點符號的出現晚於文字的出現,所以以前的語言都是沒有標點的。現在你要處理的就是一段沒有標點的文章。 一段文章\(T\)是由若幹小寫字母構成。

P3705 [SDOI2017]新生舞會 解題報告

做的 () set return 假設 else space 女生 AD P3705 [SDOI2017]新生舞會 題目描述 學校組織了一次新生舞會,\(Cathy\)作為經驗豐富的老學姐,負責為同學們安排舞伴。 有\(n\)個男生和\(n\)個女生參加舞會買一個男生和一個

P1984 [SDOI2008]燒水問題 解題報告

永遠 cti 優先 str -s 得到 至少 小數點後兩位 我們 P1984 [SDOI2008]燒水問題 題目描述 把總質量為1kg的水分裝在n個杯子裏,每杯水的質量均為(1/n)kg,初始溫度均為0℃。現需要把每一杯水都燒開。我們可以對任意一杯水進行加熱。把一杯水的溫度

P4568 [JLOI2011]飛行路線 解題報告

clas amp 設有 ret 另一個 turn ali struct 6.2 P4568 [JLOI2011]飛行路線 題目描述 Alice和Bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在\(n\)個城市設有業務,設這些城市分別標記為0到\(n

P2542 [AHOI2005]航線規劃 解題報告

tin HR 當前 星際 能夠 min CA 所在 str P2542 [AHOI2005]航線規劃 題目描述 對Samuel星球的探險已經取得了非常巨大的成就,於是科學家們將目光投向了Samuel星球所在的星系——一個巨大的由千百萬星球構成的Samuel星系。 星際空間站

P1412 經營與開發 解題報告

min 依次 答案 小數 公式 中一 保存 5.0 升級 P1412 經營與開發 題目描述 \(4X\)概念體系,是指在\(PC\)戰略遊戲中一種相當普及和成熟的系統概念,得名自4個同樣以“\(EX\)”為開頭的英語單詞。 \(eXplore\)(探索) \(eXpand\

P1144 最短路計數 解題報告

++ 報告 CA amp ret 正整數 std 最短路 www P1144 最短路計數 題目描述 給出一個\(N\)個頂點\(M\)條邊的無向無權圖,頂點編號為\(1-N\)。問從頂點1開始,到其他每個點的最短路有幾條。 輸入輸出格式 輸入格式: 第一行包含2個正整數\(

P2473 [SCOI2008]獎勵關 解題報告

有時 init line ++ 簡單 情況 %d 種類 整數 P2473 [SCOI2008]獎勵關 題目描述 你正在玩你最喜歡的電子遊戲,並且剛剛進入一個獎勵關。在這個獎勵關裏,系統將依次隨機拋出\(k\)次寶物,每次你都可以選擇吃或者不吃(必須在拋出下一個寶物之前做出選

P1341 無序字母對 解題報告

lib .html turn clu 輸入輸出格式 pair init ace 1+n P1341 無序字母對 題目描述 給定n個各不相同的無序字母對(區分大小寫,無序即字母對中的兩個字母可以位置顛倒)。請構造一個有n+1個字母的字符串使得每個字母對都在這個字符串中出現。

P2048 [NOI2010]超級鋼琴 解題報告

最大值 相同 algo src n-n 可能 noi fine 輸入輸出格式 P2048 [NOI2010]超級鋼琴 題目描述 小Z是一個小有名氣的鋼琴家,最近C博士送給了小Z一架超級鋼琴,小Z希望能夠用這架鋼琴創作出世界上最美妙的音樂。 這架超級鋼琴可以彈奏出n個音符,編

P1338 末日的傳說 解題報告

正整數 輸入輸出 他還 inline 參加 方式 記錄 超過 pan P1338 末日的傳說 題目描述 只要是參加jsoi活動的同學一定都聽說過Hanoi塔的傳說:三根柱子上的金片每天被移動一次,當所有的金片都被移完之後,世界末日也就隨之降臨了。 在古老東方的幻想鄉,人們都

P2324 [SCOI2005]騎士精神 解題報告

else if urn swa swap 報告 while 就是 include har P2324 [SCOI2005]騎士精神 題目描述 輸入輸出格式 輸入格式: 第一行有一個正整數T(T<=10),表示一共有N組數據。接下來有T個5×5的矩陣,0表示白色騎士,

P2173 [ZJOI2012]網絡 解題報告

文件 cat tmp 輸出格式 roo 不存在 數據規模 否則 data P2173 [ZJOI2012]網絡 題目描述 有一個無向圖G,每個點有個權值,每條邊有一個顏色。這個無向圖滿足以下兩個條件: 對於任意節點連出去的邊中,相同顏色的邊不超過兩條。 圖中不存在同色的環,

P4592 [TJOI2018]異或 解題報告

P4592 [TJOI2018]異或 題目描述 現在有一顆以\(1\)為根節點的由\(n\)個節點組成的樹,樹上每個節點上都有一個權值\(v_i\)。現在有\(Q\)次操作,操作如下: 1 x y:查詢節點\(x\)的子樹中與\(y\)異或結果的最大值 2 x y:查詢路徑\(x\)到\(y\

P3242 [HNOI2015]接水果 解題報告

取消 區間 span 格式 type 有序 sum query 描述 P3242 [HNOI2015]接水果 題目描述 風見幽香非常喜歡玩一個叫做 \(osu!\) 的遊戲,其中她最喜歡玩的模式就是接水果。由於她已經\(DT\) \(FC\) 了\(\tt{The\ big

P1505 [國家集訓隊]旅遊 解題報告

P1505 [國家集訓隊]旅遊 題目描述 \(\tt{Ray}\) 樂忠於旅遊,這次他來到了\(T\)城。\(T\)城是一個水上城市,一共有 \(N\) 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,\(T\) 城的任意兩個景點之間有且只有一條路徑。換句話說, \(T\)