#Articulation Points
#Graph
#DFS
#BFS
Method:
Turn off each node and see if all the other nodes except that are visited or not using DFS
Sample I/O:
Method:
Turn off each node and see if all the other nodes except that are visited or not using DFS
Sample I/O:
5 5 1 2 3 4 0 6 2 1 3 5 4 6 2 0 5 1 2 2 3 4 4 5 0 0
#include <cstdio> #include <iostream> #include <vector> #include <cstring> using namespace std; bool con[200][200]; vector< pair<int, int> > edges; bool visit[200]; void init_con(int n) { for (int i=0 ; i<=n ; i++) for (int j=0 ; j<=n ; j++) con[i][j] = false; } int dfs_visit(int s, int n) { int vCount = 1; if (visit[s]) return 0; visit[s] = true; for (int i=1 ; i<=n ; i++) { if (!visit[i] && con[s][i]) { vCount += (dfs_visit(i,n)); } } return vCount; } int dfs(int s, int n) { int vCount = 0; for (int i=1 ; i<=n ; i++) { visit[i] = false; } visit[s] = true; for (int i=1 ; i<=n ; i++) { if (!visit[i]) { vCount = dfs_visit(i,n); return vCount; } } return vCount; } int find_bridges(int n) { int aps = 0, i, j; for (int i=1 ; i<=n ; i++) { if (dfs(i,n) != (n-1)) aps++; } return aps; } char buf[10000]; int main( void ) { //freopen("inp.dat","r+",stdin); int n, result, vtx, plc; char *p; while (scanf("%d",&n)==1 && n!=0) { getchar(); init_con(n); edges.clear(); while (gets(buf)) { if (!strcmp(buf,"0")) break; p = strtok(buf," "); sscanf(p,"%d",&plc); while ((p=strtok(NULL," "))) { sscanf(p,"%d",&vtx); con[plc][vtx] = con[vtx][plc] = true; edges.push_back(make_pair(plc,vtx)); } } result = find_bridges(n); cout << result << endl; } return 0; }
No comments:
Post a Comment
Post your comment here. If you want to say something about programming problems, scripts, software etc, please try to be as descriptive as possible.