-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy path10199.cpp
More file actions
110 lines (105 loc) · 1.55 KB
/
10199.cpp
File metadata and controls
110 lines (105 loc) · 1.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include<iostream>
#include<stdio.h>
#include<vector>
#include<map>
#include<algorithm>
#include<string.h>
#include<string>
#define min(a,b) (a<b ?a:b)
#define si 110
using namespace std;
map<string,long>mp;
vector<long>ve[si];
char ch[si][40],ch1[40],ch2[40];
long df[si],visit[si],cnt[si],num,res[si],par[si],pa;
struct ss
{
string st;
}stru[si];
bool cmp(ss aa,ss bb)
{
return aa.st<bb.st;
}
long dfs(long node,long p)
{
df[node]=num++;
visit[node]=1;
long l=num,i,ll=ve[node].size(),u,rec;
for(i=0;i<ll;i++)
{
u=ve[node][i];
if(visit[u]==0&u!=p)
{
visit[u]=1;
rec=dfs(u,node);
if(node==pa)
cnt[node]++;
if(rec>=df[node])
res[node]++;
l=min(l,rec);
}
else if(u!=p)
l=min(l,df[u]);
}
visit[node]=2;
return l;
}
int main()
{
long n,i,e,x=1,u,v,j,fg=0,c;
while(~scanf("%ld",&n)&&n)
{
if(fg)
printf("\n");
fg=1;
for(i=1;i<=n;i++)
{
scanf("%s",ch[i]);
mp[ch[i]]=i;
}
scanf("%ld",&e);
while(e--)
{
scanf("%s%s",ch1,ch2);
u=mp[ch1];
v=mp[ch2];
ve[u].push_back(v);
ve[v].push_back(u);
}
num=1;
c=0;
for(i=1;i<=n;i++)
{
if(visit[i]==0)
{
pa=i;
par[i]=1;
dfs(i,-1);
}
}
j=0;
for(i=1;i<=n;i++)
{
if(res[i])
{
if(par[i]&&cnt[i]>1)
{
c++;
stru[j++].st=ch[i];
}
else if(par[i]!=1)
{
c++;
stru[j++].st=ch[i];
}
}
ve[i].clear();
res[i]=visit[i]=cnt[i]=par[i]=0;
}
sort(stru,stru+j,cmp);
printf("City map #%ld: %ld camera(s) found\n",x++,c);
for(i=0;i<j;i++)
cout<<stru[i].st<<endl;
}
return 0;
}