hdu 1269 hdu 2767 強連通分量)

2021-06-22 05:38:40 字數 2596 閱讀 9223

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];

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 }

思路:可以用tarjan演算法求出求出有向圖的強連通分量,並進行染色,然後在縮點,縮點的好處就是把原本雜亂的有向圖變成有向無環圖。。。

然後統計入度為0的點和出度為0的點,取其較大值就是所求的要求新增的最少的邊的條數了。

1 #include2 #include3 #include4

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的演算法流程:

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 條邊的有向圖,至少新增幾條邊可以使得整個圖變成強連通圖?題解 強連通分量縮點,判斷每個點的出度或者入度是否為零,最終結果為出度為零的...