強連通專題

2022-05-17 22:36:49 字數 3214 閱讀 5295

求割點(無向邊):

所謂的割點,就是刪除某個點,圖便不連通了。

poj  1523

#include#include

#include

using

namespace

std;

const

int mn=1111

;struct

edge

edge[mn

<<2

];int

dfn[mn];

intlow[mn];

int head[mn<<2

];int

subnet[mn];

inte,tp,root;

intvis[mn];

void

init()

void add(int a,int

b)void tarjan(int u,int

fa) }

vis[u]=2;}

intmain()

for(i=1;i<=nodes;i++)

}int flag=0

; printf(

"network #%d\n

",cas++);

for(i=1;i<=nodes;i++)

}if(flag==0) printf("

no spf nodes\n");

puts(

"");}}

view code

求割邊hdu  4738(無向邊)

題意:判斷乙個圖是否聯通,並給出每條邊的權值,若聯通則讓你找出最小權值的割邊。

注意:當所有邊的權值為0的話且聯通的話輸出1,若不聯通的話輸出0

由於儲存權值的陣列開小了,所以超時。。。。超時。。。。

#include#include

#include

using

namespace

std;

const

int mn=1010

;int

dfn[mn],low[mn],num[mn];

int vis[mn],ww[mn*mn];

inttp,e;

intans,cnt;

struct

edge

edge[mn*mn];

int head[mn*mn];

int bridge[mn*mn];

void

init()

int add(int a,int b,int pos,int

c) }

edge[e].tag=0

; edge[e].w=c;

edge[e].pos=c;

edge[e].to=b;

edge[e].next=head[a];

head[a]=e++;

}void tarjan(int u,int

fa) }

else

low[u]=min(low[u],dfn[v]);

}}int

main()

ans=0

; tarjan(

1,-1

); cnt=0

;

for(int j=1; j<=n; j++)

if(cnt) printf("

0\n"

);

else

if(min==0) printf("

1\n"

);

else printf("

%d\n

",min);

}else printf("

-1\n");}}

return0;

}

view code

poj 3177(無向圖求)

題意:農場主有f片田野,他想把牛遷移,但是牛要是只走一條路的話會把這條路的草都吃沒了,所以他想

從a到b之間有大於等於2的路。現在給你乙個聯通的圖,問最少加多少條邊能夠讓任意兩點有大於等於2

條路可以走、

分析:求邊雙聯通分量

求雙聯通分量然後縮點,再求縮點後的葉子幾點,加的邊就是(ans+1)/2;

#include#include

#include

using

namespace

std;

const

int mn=5010

;const

int mm= 10011

;int

low[mn],dfn[mn];

intinstack[mm];

intsubnet[mn],vis[mn];

intstap[mn],head[mm];

intdegree[mn];

intbelong[mn];

inttp,root;

inte,p;

intans;

intcnt;

struct

edge

edge[mm];

void addedge(int a,int

b) }

edge[e].to=b;

edge[e].next=head[a];

head[a]=e++;

}void

init()

void tarjan(int x,int

fa)

else

if(instack[v] && dfn[v]

low[x]=dfn[v];

}if(low[x]==dfn[x])

while(x!=top);

cnt++;

}}int

main()

for(i=1; i<=n; i++)

}for(i=1;i<=n;i++)}}

int res=0

;

for(i=0;i//

由於無向圖每個點的度加了兩次

//printf("output for sample input %d\n",cas++);

printf("

%d\n\n

",(res+1)/2

); }

return0;

}

view code

個人專題一 強連通 Poj 2186

思路1 include include includeusing namespace std 儲存變數 int x,y vectorf 10000 儲存正向圖 vectorn 10000 儲存反向圖 bool sign 10000 輔助變數 int i,g,h,sum,r void init int...

迷宮城堡HDU1269 (強連通專題)

原題目 為了訓練小希的方向感,gardon建立了一座大城堡,裡面有n個房間 n 10000 和m條通道 m 100000 每個通道都是單向的,就是說若稱某通道連通了a房間和b房間,只說明可以通過這個通道由a房間到達b房間,但並不說明通過它可以由b房間到達a房間。gardon需要請你寫個程式確認一下是...

強連通分量 tarjan求強連通分量

雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...