給定乙個有向圖,問至少增加多少條邊才能使得整個圖變成乙個強連通分量。
這道題是個結論題。縮點後,統計每個點的入度和出度。入度為0的點的數量以和出度為0的點的數量取最大值,這就是最終的結果。
#include
#include
#include
#include
#include
using
namespace std;
const
int n =
110, m =
10010
;int n;
int h[n]
, e[m]
, ne[m]
, idx;
int low[n]
, dfn[n]
, timestamp;
stack<
int> stk;
bool in_stk[n]
;int id[n]
, sz[n]
, scc_cnt;
int din[n]
, dout[n]
;void
add(
int a,
int b)
void
tarjan
(int u)
else
if(in_stk[j]
) low[u]
=min
(low[u]
, dfn[j]);
}if(dfn[u]
==low[u]
)while
(v!=u);}
}int
main()
for(
int i=
1;i<=n;i++)}
for(
int i=
1;i<=n;i++)}
}int sa =
0, sb =0;
for(
int i=
1;i<=scc_cnt;i++
) cout << sa << endl;
if(scc_cnt==
1) cout <<
0<< endl;
else cout <<
max(sa,sb)
<< endl;
return0;
}
強連通分量 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 下圖中,子圖為乙個強連通分量,因為...