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 }