時間限制:
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.
輸出對於每組測試資料,輸出最少需要新增的這種允許關係的個數。
樣例輸入
152 4 3 0
4 5 000
1 0
樣例輸出
2
思路:強連通分量縮點後,再找入度為0的節點數 和 出度為0的節點數 的最大值即可。
ac:
#include #include #include #include #include using namespace std;
const int vmax = 105;
int in[vmax], out[vmax];
vectorg[vmax];
int n;
int dfs_clock, scc_cnt;
int pre[vmax], cmp[vmax], low[vmax];
stacks;
void dfs (int u) else if (!cmp[v])
}if (pre[u] == low[u])
}}void scc()
}int main()
for (int i = 1; i <= n; ++i)
}scc();
for (int i = 1; i <= n; ++i)
}int in_num = 0, out_num = 0;
for (int i = 1; i <= scc_cnt; ++i)
printf("%d\n", max(in_num, out_num));
}return 0;
}
強連通分量 tarjan求強連通分量
雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...
強連通分量
對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...
強連通分量
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...