1 #include2 #include3 #include4思路:可以用tarjan演算法求出求出有向圖的強連通分量,並進行染色,然後在縮點,縮點的好處就是把原本雜亂的有向圖變成有向無環圖。。。const
int maxn=10000+10;5
using
namespace
std;
6 vectormp[maxn];
7 stacks;
8int
n,m;
9int
_count;
10int
cnt;
11bool
mark[maxn];
12int
dfn[maxn];
13int
low[maxn];
1415
//求強連通分量tarjan
16void tarjan(int
u)else
if(mark[v]&&dfn[v]
29if(low[u]==dfn[u])while(u!=v);37}
38}3940
41int
main()
50 memset(mark,false,sizeof
(mark));
51 memset(dfn,0,sizeof
(dfn));
52 memset(low,0,sizeof
(low));
53 _count=0
;54 cnt=0;55
for(int i=1;i<=n;i++)59}
60if(_count>1
)else
63 printf("
yes\n");
64}65return0;
66 }
然後統計入度為0的點和出度為0的點,取其較大值就是所求的要求新增的最少的邊的條數了。
1 #include2 #include3 #include4下面貼乙個tarjan的演算法流程:const
int maxn=20000+10;5
using
namespace
std;
6 vectormp[maxn];
7 stacks;
8bool
mark[maxn];
9int
dfn[maxn],low[maxn];
10int color[maxn];//
染色11
intn,m,_count,cnt;
12int
from
[maxn],to[maxn];
1314
15//
求有向圖強連通分量
16void tarjan(int
u)else
if(mark[v]&&dfn[v]
29if(low[u]==dfn[u])while(u!=v);38}
39}4041
intmain()
52 memset(mark,false,sizeof
(mark));
53 memset(dfn,0,sizeof
(dfn));
54 memset(low,0,sizeof
(low));
55 memset(color,0,sizeof
(color));
56 memset(from,0,sizeof(from
));57 memset(to,0,sizeof
(to));
58 _count=0,cnt=0;59
for(int i=1;i<=n;i++)63}
64if(_count==1)68
for(int i=1;i<=n;i++)75}
76}77int
in=0,out=0;78
for(int i=1;i<=_count;i++)
82 printf("
%d\n
",max(in,out));//
max(in,out)即為最少需要連的邊83}
84return0;
85}8687
8889
9091
9293
tarjan(u)
dfn[u]=low[u]=++cnt;
stack.push(u)
for(each(u,v) in e)
if(v is not visited)
tarjan(v);
low[u]=min(low[u],low[v]);
else if(v is in stack)
low[u]=min(low[u],dfn[v]);
if(dfn[u]==low[u])
repeat
v=stack.pop
print v
until(u==v);
hdu 2767 強連通縮點
補最少的邊成強連通圖。縮點後成dag,max即為所求。include include include define mn 20020 define me 200010 define mm a,b as void add e int i,int u,int v void tarjan int i el...
HDU 2767 強連通縮點
如a能證明b 就建一條有向邊a b。對於乙個能互相證明的乙個集合,必然每個2個點都能相互到達,這樣的乙個集合就是乙個強連通集合。我們可以把他們看成乙個點,剩下的就是乙個dag圖了。如要都能相互到達,每個點必然出度 1,入度 1 所以統計有多少沒有入度的點和多少沒有出度的點,他們中最大的就是需要新增的...
hdu2767 強連通分量
hdu2767 proving equivalences 傳送門題意 給定乙個 n 1 leq n leq 20000 個頂點,m 0 leq m leq 50000 條邊的有向圖,至少新增幾條邊可以使得整個圖變成強連通圖?題解 強連通分量縮點,判斷每個點的出度或者入度是否為零,最終結果為出度為零的...