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,將這些點...