HDU 2767 強連通縮點

2021-06-28 12:02:31 字數 1280 閱讀 6336

如a能證明b ,就建一條有向邊a->b。對於乙個能互相證明的乙個集合,必然每個2個點都能相互到達,這樣的乙個集合就是乙個強連通集合。我們可以把他們看成乙個點,剩下的就是乙個dag圖了。 如要都能相互到達,每個點必然出度 >=1, 入度》1 .。所以統計有多少沒有入度的點和多少沒有出度的點,他們中最大的就是需要新增的邊了。

view code

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define eps 1e-8

#define ex 2.7182818284590452354

#define pi acos(-1.0)

#define inf 0x3fffffff

#define dc(n) printf("case #%d:",++n)

#define sd(n) scanf("%d",&n)

#define ss(str) scanf("%s",str)

#define sdb(n) scanf("%lf",&n)

#define ll long long

#define mm 1000000007

#define mmax 20010

using namespace std;

struct node

e[50010];

int p[mmax];

int num;

void add(int st,int en)

void init()

int fa[mmax];

int dfn[mmax];

int low[mmax];

int times;

int q[mmax];

int pp;

bool instack[mmax];

int find(int x)

void tarjin(int u)

else if(instack[v])

low[u]=min(low[u],dfn[v]);

}if(dfn[u]==low[u])

}}int in[mmax];

int out[mmax];

int main()

{ int t;

cin>>t;

while(t--)

{init();

int n,m;

cin>>n>>m;

for(int i=0;i

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...

hdu2767強連通加縮點

題目說了一大堆,前面的沒有用,就是讓你判斷要加幾條邊才能強連通,用到縮點的知識 二重迴圈,判斷鄰接表下乙個點是不是在強連通分量中,入度,出度分別儲存下來,輸出較大的那乙個 include include include include include include include include ...

hdu2767 強連通分量

hdu2767 proving equivalences 傳送門題意 給定乙個 n 1 leq n leq 20000 個頂點,m 0 leq m leq 50000 條邊的有向圖,至少新增幾條邊可以使得整個圖變成強連通圖?題解 強連通分量縮點,判斷每個點的出度或者入度是否為零,最終結果為出度為零的...