poj1144 求割點的個數(注意輸入的格式)

2021-09-03 00:22:08 字數 1853 閱讀 3982

描述

**線公司(tlc)正在建立乙個新的**電纜網路。它們連線了幾個從1到n的整數編號的位置。沒有兩個地方有相同的號碼。線路是雙向的,並且總是將兩個地方連線在一起,並且在每個地方線路終止於**交換機。每個地方都有乙個**交換機。它來自每個地方 

可以通過其他地方的線路到達,但它不需要是直接連線,它可以通過幾個交換。電源有時會在乙個地方發生故障,然後交換機無法執行。tlc的**意識到,在這種情況下,除了失敗的地方無法到達之外,還可能導致其他地方無法相互連線。在這種情況下,我們會說這個地方(

發生故障的地方 )是至關重要的。現在,**正試圖編寫乙個程式來查詢所有這些關鍵位置的數量。幫助他們。

輸入

輸入檔案由幾個行塊組成。每個塊描述乙個網路。在每個塊的第一行中,存在n <100的位數。接下來最多n行中的每一行包含乙個地點的數字,後面跟有來自該地方的直線的一些地方的數量。這些最多n行完全描述了網路,即,網路中兩個位置的每個直接連線至少包含在一行中。一行中的所有數字

由乙個空格分隔 。每個塊以一條僅包含0的行結束。最後乙個塊只有一行,n = 0;

產量

輸出包含除輸入檔案中的最後乙個塊之外的每個塊,其中一行包含關鍵位置的數量。

樣本輸入

5

5 1 2 3 406

2 1 3

5 4 6 200

樣本輸出

1

2

題意:

給你乙個無向圖,問你這個圖中有多少個割點.不過該題的輸入格式說的比較難懂.這裡解釋一下:每個例項第一行是n,表示節點數.接下來可能有最多n行描述邊資訊的.

其中這n行每行都是這樣的:每行第乙個數表示該行的主頂點u,接著的所有數字表示副頂點v1,v2,v3…等.表示u與v1,u與v2,u與v3分別都有一條邊.

最後這個例項以乙個0表示結束.

當然所有例項之後還有乙個0(n=0),表示輸入結束.

**如下:

//求無向圖的割頂和橋

#include#include#include#include#include#includeusing namespace std;

const int maxn=1000+10;

int n,m;

int dfs_clock;//時鐘,每訪問乙個節點增1

vectorg[maxn];//g[i]表示i節點鄰接的所有節點

int pre[maxn];//pre[i]表示i節點被第一次訪問到的時間戳,若pre[i]==0表示i還未被訪問

int low[maxn];//low[i]表示i節點及其後代能通過反向邊連回的最早的祖先的pre值

bool iscut[maxn];//標記i節點是不是乙個割點

//求出以u為根節點(u在dfs樹中的父節點是fa)的樹的所有割頂和橋

//初始呼叫為dfs(root,-1);

int dfs(int u,int fa) //直接用模板就行了

}else if(pre[v]}

if(fa<0 && child==1 )

iscut[u]=false;//u若是根且孩子數<=1,那u就不是割頂

return low[u]=lowu;

}int main()

}dfs(1,-1);

int ans=0;

for(int i=1;i<=n;i++)if(iscut[i]==true)

ans++;

cout<}

return 0;

}

poj1144 求割點模板

以後這種模板還是看書比較好,網上的部落格都講得不是很好,推薦lyd寫的 演算法競賽高階指南 寫的,比較現代化 是的我就是在嫌棄紫書白書 然後講解的也通俗易懂。在各類tarjan演算法中,dfn i 表示到達i的序號,low i 表示i所能間接到達的點中dfn最小的值。那麼如果乙個點u是割點,如果他是...

poj1144 求割點數)

別人寫的對割點的詳細介紹 無向圖求點割集演算法 出處 黑書上給出了關於求點割集的演算法,但是比較模糊,我查閱了網路上的相關資料,理解了求點割集的過程,寫出如下求點割集的 並寫了一些簡單的證明.割點集的定義 如果在連通圖g中去掉某一點後圖不連通,那麼這個點即為g的割點,所有割點的集合即為點割集。求點割...

poj 1144 求割點 太奇怪了。。。。

求割點數很簡單 難在一些細節 到現在還不清楚為什麼一開始就設定dfn為1為什麼會錯 錯誤的 view code include include int n,son,ans int map 1000 1000 int dfn 1000 low 1000 int vis 1000 int tdfn in...