The problem uses the concept of Articulation Points. One critical case is when the graph is already disconnected.
Method: For each vertex, I first counted it's child count (dfscount, dfsnum). Then I counted them again after disconnecting that vertex. If both of them aren't same, I incremented the Articulation Point count, because that vertex is an articulation point.
Method: For each vertex, I first counted it's child count (dfscount, dfsnum). Then I counted them again after disconnecting that vertex. If both of them aren't same, I incremented the Articulation Point count, because that vertex is an articulation point.
6 sugarloaf maracana copacabana ipanema corcovado lapa 7 ipanema copacabana copacabana sugarloaf ipanema sugarloaf maracana lapa sugarloaf maracana corcovado sugarloaf lapa corcovado 5 guanabarabay downtown botanicgarden colombo sambodromo 4 guanabarabay sambodromo downtown sambodromo sambodromo botanicgarden colombo sambodromo 6 a b d c e f 7 a b a d d c b d c e c f e f 7 g f e d c b a 6 a b b c c d d e e f f g 7 g f e d c b a 7 a b b c c d d e e f f g g a 7 g f e d c b a 6 a b b c c d d e e f f a 6 a b c d e f 5 a b a f c d c e d e 3 a b c 2 a b b c 0
#include <cstdio>
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;
bool visited[200], con[200][200];
int dfscounter;
int dfs(int v, int n) {
visited[v] = true;
dfscounter++;
for (int i=1 ; i<=n ; i++) {
if (!visited[i] && con[v][i]) {
dfs(i, n);
}
}
}
map<string, int> cmap;
vector<string> lst;
int artP;
int main( ) {
int n, e, kase=1;
//freopen("tourist.txt","r+",stdin);
//freopen("output.txt","w+",stdout);
while ( cin >> n ) {
if (!n) break;
if (kase>1) cout << endl;
cmap.clear();
lst.clear();
artP = 0;
for (int i=1 ; i<=n ; i++) {
string a;
cin >> a;
cmap[a] = i;
}
cin >> e;
for (int i=1 ; i<=n ; i++) for (int j=1 ; j<=n ; j++) con[i][j] = false;
for (int i=1 ; i<=e ; i++) {
string a, b;
cin >> a >> b;
con[ cmap[a] ][ cmap[b] ] = con[ cmap[b] ][ cmap[a] ] = true;
}
for (map<string, int>::iterator it=cmap.begin() ; it!=cmap.end() ; it++) {
int rcount;
dfscounter=0;
for (int i=1 ; i<=n ; i++) visited[i] = false;
dfs(it->second, n);
rcount = dfscounter;
for (int i=1 ; i<=n ; i++) visited[i] = false;
visited[it->second] = true;
dfscounter=0;
for (int i=1 ; i<=n ; i++) {
if (con[ it->second ][i]) {
dfs(i, n);
break;
}
}
if (rcount>1 && dfscounter!=rcount-1) {
artP++;
lst.push_back(it->first);
}
}
printf("City map #%d: %d camera(s) found\n",kase++,lst.size());
for (int i=0 ; i<lst.size() ; i++) {
cout << lst[i] << endl;
}
}
}
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.