強連通分量縮點 DAG度數測定(poj1236)

2021-09-26 08:10:44 字數 1724 閱讀 7624

poj1236

task1,將縮點完了之後的每個塊的入度為零的點的個數

task2,是在縮完點的dag的基礎上新增多少條邊使得 dag 之間的所有點能夠相互到達(形成乙個 scc),套結論:入度為 0 的點的個數和出度為 0 的點個數的最大者

其中找連通分量可以通過vector儲存有向圖的資訊(用vector 儲存鄰接表。)(使用nt,to,head陣列是用陣列來表示鄰接關係),vector這種儲存圖的方法也可以儲存無向的,只不過在push的時候兩個方向都push一下即可,例如樹鏈剖分哦貌似在樹上,就類似這種vector的儲存方法。

//

// main.cpp

// 強連通_將塊縮為一點_poj1236_m

//// created by 陳冉飛 on 2019/8/20.

//#include

using namespace std;

#define maxn 105

int n,dfn[maxn]

,low[maxn]

,tim =

0,num =

0,size[maxn]

,id[maxn]

;bool in[maxn]

;#include

vector<

int>map[maxn]

;#include

stack<

int>s;

#include

#define cl(a,b) memset(a,b,sizeof(a))

void

tarjan

(int u)

else

if(in[map[u]

[i]]

) low[u]

=min

(low[u]

,dfn[map[u]

[i]]);

}if(dfn[u]

== low[u]

) num++;}

}int

main

(int argc,

const

char

* ar**)

while

(!s.

empty()

) s.

pop();

cl(in,0)

;cl(dfn,-1

);for(

int u =

1; u <= n; u++)if

(dfn[u]==-

1)tarjan

(u);

for(

int i =

0; i < num; i++

) dfn[i]

= low[i]=0

;for

(int u =

1; u <= n ; u++

)for

(int j =

0; j < map[u]

.size()

; j++)if

(id[u]

!= id[map[u]

[j]]

)int ans1 =

0,ans2 =0;

for(

int i =

0; i < num; i++

) ans2 =

max(ans2,ans1);if

(num ==1)

cout

}

演算法 強連通分量縮點

有時對於乙個有向圖我們及其渴望將其變為乙個有向無環圖,這樣我們就要用到強連通分量縮點了。洛谷3387 縮點 題目背景 縮點 dp。題目描述 給定乙個 n個點 m條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。允許多次經過一條邊或者乙個點,但是,重複經過的...

強連通分量縮點的模板

include include include include using namespace std define inti a memset a,0,sizeof a define min a,b a b b a define max a,b a b a b const int max 1605...

poj1236 強連通分量 縮點

題意 n 2 題解 找強連通分量,縮點。記f i 為縮完點後的新圖中各點入度,g i 為出度,ans1為f i 0的點的數目,ans2為g i 0的點的數目則第一問為ans1,第二問則為max。至於第二問的解釋,我的想法是對於得到的dag圖,考慮其中的出度為0的點和入度為0的點組成的點集v,將這些點...