nyoj 120 校園網路

2021-07-31 12:38:29 字數 1629 閱讀 9016

時間限制:3000 ms  |  記憶體限制:65535 kb

難度:5

描述 南陽理工學院共有m個系,分別編號1~m,其中各個系之間達成有一定的協議,如果某系有新軟體可用時,該系將允許一些其它的系複製並使用該軟體。但該允許關係是單向的,即:a系允許b系使用a的軟體時,b未必一定允許a使用b的軟體。

現在,請你寫乙個程式,根據各個系之間達成的協議情況,計算出最少需要新增多少個兩系之間的這種允許關係,才能使任何乙個系有軟體使用的時候,其它所有系也都有軟體可用。

輸入第一行輸入乙個整數t,表示測試資料的組數(t<10)

每組測試資料的第一行是乙個整數m,表示共有m個系(2<=m<=100)。

隨後的m行,每行都有一些整數,其中的第i行表示系i允許這幾個系複製並使用系i的軟體。每行結尾都是乙個0,表示本行輸入結束。如果某個系不允許其它任何系使用該系軟體,則本行只有乙個0.

輸出對於每組測試資料,輸出最少需要新增的這種允許關係的個數。

樣例輸入

1

52 4 3 0

4 5 000

1 0

樣例輸出

2

**poj改編

最先看到這道題的時候還在想是否可以用並查集來判有幾個環的,後來看了網上的詳解,原來是要用有向圖的強連通的思想,不明白強連通的可以看看這篇文章文章

這道題主要是用tarjan + 縮點,把圖中的強連通分量縮點,重新編號,這樣我們求出來每個點的出度和入度,然後我們取其中的最大值,這樣我們可以保證每兩個點(原圖中的強連通分量)可以相通。

ac**:

#include #include #include #include #include using namespace std;

#define max 105

int map[max][max], dfn[max], low[max], in[max], out[max];

int flag[max], step[max];

stacks;

int res, tot, m, ans;

void init()

void tarjan(int v)

///flag[i]這個判斷條件很重要,這樣可以避免已經確定在其他聯通圖的i,因為v到i的單向邊而影響到v的low

///也就是已經確定了的聯通圖要剔除掉,剔除的辦法就是判斷其還在棧中,因為已經確定了的連通圖的點

///flag在下面的do while中已經設為0了(即已經從棧中剔除了)

else if(flag[i]) }}

if(dfn[v]==low[v])

while(v!=u);

}}void solve()

}int xx = 0, yy = 0;

for(int i = 1; i <= res; i++)

ans = max(xx, yy);

}int main()

}for(int i = 1; i <= m; i++)

}solve();

if(ans==1)

printf("0\n");

else

printf("%d\n",ans);

}return 0;

}

NYOJ 120 校園網路

時間限制 3000 ms 記憶體限制 65535 kb 難度 5 描述 南陽理工學院共有m個系,分別編號1 m,其中各個系之間達成有一定的協議,如果某系有新軟體可用時,該系將允許一些其它的系複製並使用該軟體。但該允許關係是單向的,即 a系允許b系使用a的軟體時,b未必一定允許a使用b的軟體。現在,請...

NYOJ 120 校園網路

時間限制 3000 ms 記憶體限制 65535 kb 難度 5 描述 南陽理工學院共有m個系,分別編號1 m,其中各個系之間達成有一定的協議,如果某系有新軟體可用時,該系將允許一些其它的系複製並使用該軟體。但該允許關係是單向的,即 a系允許b系使用a的軟體時,b未必一定允許a使用b的軟體。現在,請...

nyoj 120 校園網路

也就是求新增多少條邊可以構成強連通,有向圖。方法是有trajan之後縮點,看新構成的圖出度或者入度為零,大的即為要加的邊。有主意圖本身就連通是這是加的變為0,而不是1.view code 1 include 2 include 3 include 4 include 5 using namespac...