題目說了一大堆,前面的沒有用,就是讓你判斷要加幾條邊才能強連通,用到縮點的知識
二重迴圈,判斷鄰接表下乙個點是不是在強連通分量中,入度,出度分別儲存下來,輸出較大的那乙個
#include#include#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi acos(-1)
#define ll long long
#define mod 1000000007
using
namespace
std;
const
int n=20005,maxn=100005,inf=0x3f3f3f3f
;int n,m;//
判斷是不是在棧中,2為在棧中,1為已訪問不在棧中,0為不在棧中
stacks;
vector
v[n],ans[n];
intdfn[n],low[n];
intinans[n],ins[n];
intnum,index;
intin[n],out
[n];
void tarjan(int
u)
else
if(ins[x]==2)low[u]=min(low[u],dfn[x]);
}if(dfn[u]==low[u])
}}int
main()
while(!s.empty())s.pop();
cin>>n>>m;
while(m--)
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
if(num==1
)
for(int i=1;i<=n;i++)
}int a=0,b=0
;
for(int i=1;i<=num;i++)
cout
}return0;
}
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 條邊的有向圖,至少新增幾條邊可以使得整個圖變成強連通圖?題解 強連通分量縮點,判斷每個點的出度或者入度是否為零,最終結果為出度為零的...