第一問:需要幾個學校存在軟體,才能通過傳遞,使得所有的學校都有軟體
用tarjan演算法求出強聯通分量後,將每個聯通分量縮成乙個點,那麼問題1的答案就是入度為0的點的個數
為什麼?入度為0的點,肯定不能通過其他學校傳送軟體給他,所以他必須存在乙份軟體
第二問:需要加幾條邊,才能使得圖強聯通
縮點後,a為所有入度為0的點的個數,b為所有出度為0的點的個數,那麼答案就是max(a,b)
1 #include 2 #include3 #include 4 #include 5
using
namespace
std;
6const
int n = 100 + 10
;7 vectorg[n];
8 stackst;
9bool
vis[n];
10int sccno[n],pre[n],lowlink[n],in[n],out
[n],dfs_clock,scc_cnt;
11int min(const
int &a, const
int &b)
1215
void tarjan(int
u)16
27else
if(!sccno[v])
28 lowlink[u] =min(lowlink[u],pre[v]);29}
30if(lowlink[u]==pre[u])
3139}40
}41void find_scc(int
n)42
47int
main()
48 58}
59find_scc(n);
60for(i=1; i<=scc_cnt; ++i) in[i] = out[i] = 1;61
for(int u=1; u<=n; ++u)
62for(i=0; ii)
6367 a = b = 0;68
for(i=1; i<=scc_cnt; ++i)
69
73int ans = a > b ?a : b;
74if(scc_cnt == 1) ans = 0
;75 printf("
%d\n%d\n
",a,ans);
76return0;
77 }
Tarjan演算法 強聯通分量
1 基礎知識 在有向圖g,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連...
求強聯通分量 Tarjan演算法
const int maxn 5010 const int maxm 2500000 struct edge edge maxm inthead maxn tot intlow maxn dfn maxn stack maxn belong maxn intindex,top intscc bool...
強聯通分量 tarjan
tarjan演算法思想 dfs節點的時候,用time記錄訪問順序,則父節點會先於子節點訪問。那麼節點u遞迴的過程中找到了父節點 先訪問的 形成乙個環路,這個環路上的所有節點就是乙個強聯通分量。low的作用是用強聯通分量上的最先訪問的節點 訪問到的父節點 得time作為整個強聯通分量所有節點的時間。並...