1 //vis[i] 0--尚未访问 1--正在访问 2--已经访问结束
2 //anc[i] 该点能到达的最小序号
3 //pre[i] 该点的序号
4 /*==================================================*\
5 | 无向图连通度( 割)
6 | INIT: edge[][]邻接矩阵;vis[],pre[],anc[],deg[]置为0;
7 | CALL: dfs(0, -1, 1, n);
8 | k=deg[0], deg[i]+1(i=1…n-1) 为删除该节点后得到的连通图个数
9 | 注意:0作为根比较特殊!
10 \*==================================================*/
11
12 int edge[V][V], anc[V], pre[V], vis[V], deg[V];
13 void dfs(int cur, int father, int dep, int n) { // vertex: 0 ~ n-1
14 int cnt = 0;
15 vis[cur] = 1;
16 pre[cur] = anc[cur] = dep;
17 for (int i = 0; i < n; ++i)
18 if (edge[cur][i]) {
19 if (i != father && 1 == vis[i]) {
20 if (pre[i] < anc[cur])
21 anc[cur] = pre[i]; //存在回边
22 }
23 if (0 == vis[i]) { //树边
24 dfs(i, cur, dep + 1, n);
25 ++cnt; // 分支个数
26 if (anc[i] < anc[cur])
27 anc[cur] = anc[i];//更新anc[cur]
28 if ((cur == 0 && cnt > 1)//父节点并且分支个数大于1
29 || (cnt != 0 && anc[i] >= pre[cur]))//导致了结果不同
30 ++deg[cur];
31 }
32 }
33 vis[cur] = 2;
34 }