題意:求出所有的割頂,而且還有輸出該割頂連線了幾個點雙連通分量
題解:直接tarjan求點雙聯通分量就好了,可以在加入邊的時候記錄加入次數,大於1的都是橋,輸入輸出很噁心,注意格式
#include#includeview code#include
#include
#include
#include
#include
#include
#include
#include
#include
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair#define c 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
using
namespace
std;
using
namespace
__gnu_cxx;
const
double g=10.0,eps=1e-7
;const
int n=1000+10,maxn=100000+10,inf=0x3f3f3f
;map
ma[n];
vector
v[n],bcc[n];
intdfn[n],low[n];
intindex,num;
intbccno[n],iscut[n];
struct edge;
stack
s;void tarjan(int u,intf);
if(x==f)continue
;
if(!dfn[x])
if(bccno[p.to]!=num)
if(p.from==e.from&&p.to==e.to)break
; }}}
else
}}void
init()
while(!s.empty())s.pop();
}int
main()
}for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i,-1
);
/*cout
printf(
"network #%d\n
",++cnt);
bool ok=0
;
for(int i=1;i<=n;i++)
}if(!ok)printf("
no spf nodes\n");
puts(
"");
}return0;
}/************
***********
*/
POJ 1523 割點 連通分量
題目鏈結 題目大意 連通圖,找圖中割點,並計算切除該割點後,圖中的連通分量個數。解題思路 poj的資料很弱。tarjan法求割點。pre陣列,記錄這個點的dfs時間位置。割點的條件是lowv pre u 即子點比父點先dfs,這時候父點就沒有意義了,切掉父點連通分量數肯定會增加。同時注意特判只有兩個...
POJ 1523 SPF (割頂 點雙連通分量)
題意就是求出在乙個圖上去除乙個點之後,那個圖會變成多少個子連通圖。顯然我們要求出割頂。我的 套用了劉汝佳的大白書的tarjan演算法,用乙個陣列cnt記錄乙個點是多少個點雙連通分量的割頂。當發現乙個點是割頂的時候,就cnt i 最後,如果乙個點是一棵dfs樹的樹根時,就輸出cnt i 否則就輸出cn...
割點問題 poj 1523 SPF
題目大意 給定乙個網路,看是否有關節點存在 即割點,即去除該點後,圖變成非連通圖 如果存在輸出該節點和去除該節點後連通子圖的個數,如果不存在割點即輸出沒有割點存在。求割點直接用dfs解決即可,問題在於統計去除該割點後,連通子圖的個數,其實在dfs時,遇到割點時,只要發現其兒子結點的low值比該割點的...