判斷強連通圖之後,果斷要做做強連通分量的題目,之前做求割點的題目的時候就已經學過了tarjan演算法了。。 但是還是不會用,一開始看到這個題目的時候不知道怎麼辦,感覺就是有種怪怪的感覺。。 看了網上的**,出度和入度的判斷真的還蠻精妙的。。
通過一邊tarjan演算法已經將乙個圖分解成了很多個前連通圖了。。。 這要計算出每乙個前連通分量的入度和出度來,然後新增的邊只要能使所有強連通分量連通就可以。。所以只用新增max(入度缺少,出度缺少)。。
view code
1 #include2#define min(a,b) a3
#define max(a,b) a>b?a:b
4using
namespace
std;
5struct
node
6edge[50002];9
int head[20002],exist[20002],dfn[20002],low[20002],stack[20002],weight[20002
],n,m,s,e,top,count,time;
10int ind[20002],outd[20002
];11
void tarjan(int
u) 12
23else
2428}29
if(dfn[u]==low[u])
3037 count++;38}
39}40int
main()
4152 time=top=count=0;53
for(int i=0;i)
5460
for(int i=1;i<=n;i++)
61 66}
67if(count==1)
68else
6979
} 80}
81int maxin=0,maxout=0;82
for(int i=0;i)
8387 printf("
%d\n
",max(maxout,maxin));88}
89}90return
0;
91 }
hdu2767 強連通分量
hdu2767 proving equivalences 傳送門題意 給定乙個 n 1 leq n leq 20000 個頂點,m 0 leq m leq 50000 條邊的有向圖,至少新增幾條邊可以使得整個圖變成強連通圖?題解 強連通分量縮點,判斷每個點的出度或者入度是否為零,最終結果為出度為零的...
Hdu 2767 把森林變成強連通分量 cpp
題意 給出n個點和他們之間的一些關係.問加多少條邊可以使所有的點變成強連通分量.思路 根據題意就可以知道有這個推理 原圖縮點後的有向無環圖.出度為0的點和入度為0的點中個數少的那些點向個數多的那些點連線.可以使森林變成強連通分量.tips 注意如果縮點後變成乙個點了.則入度為0和出度為0的點的個數都...
hdu 1269 hdu 2767 強連通分量)
1 include2 include3 include4 const int maxn 10000 10 5 using namespace std 6 vectormp maxn 7 stacks 8int n,m 9int count 10int cnt 11bool mark maxn 12i...