求割點(無向邊):
所謂的割點,就是刪除某個點,圖便不連通了。
poj 1523
#include#includeview code#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(
"");}}
求割邊hdu 4738(無向邊)
題意:判斷乙個圖是否聯通,並給出每條邊的權值,若聯通則讓你找出最小權值的割邊。
注意:當所有邊的權值為0的話且聯通的話輸出1,若不聯通的話輸出0
由於儲存權值的陣列開小了,所以超時。。。。超時。。。。
#include#includeview code#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;
}
poj 3177(無向圖求)
題意:農場主有f片田野,他想把牛遷移,但是牛要是只走一條路的話會把這條路的草都吃沒了,所以他想
從a到b之間有大於等於2的路。現在給你乙個聯通的圖,問最少加多少條邊能夠讓任意兩點有大於等於2
條路可以走、
分析:求邊雙聯通分量
求雙聯通分量然後縮點,再求縮點後的葉子幾點,加的邊就是(ans+1)/2;
#include#includeview code#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;
}
個人專題一 強連通 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 圖的鄰...