알고리즘
BOJ 17220 :마약수사대
minbear
2023. 7. 31. 17:27
#BOJ 17220 :마약수사대
17220번: 마약수사대
최근들어 세계적으로 마약과 관련한 사회적 문제들이 많이 발생하고 있다. 이에 따라 경찰은 마약 수사대의 한정된 인력이 허용하는 선에서 최대한 마약공급을 막고자 한다. 마약 공급책들은
www.acmicpc.net
#풀이
맨 처음에 보고 다익스트라를 생각했다가 문제를 다시 읽어보니 루트가 여러 개도 가능해서 그냥 bfs로 풀었다.
경찰이 잡은 마약범들은 인접리스트에서 지우고 루트에서 bfs를 돌린다.
그 이후 루트 빼고 방문한 정점의 개수를 구해야 하는데 마약범 인접리스트를 지워도 잡힌 마약범들은 방문할 수 도 있다.
그래서 마지막에 잡힌 마약범 방문표시를 제거해야 한다,
#코드
#include<bits/stdc++.h>
using namespace std;
int n, m;
vector<int> adj[27];
bool Root[27];
int vis[27];
int toInt = 'A' - 1;
int root;
void bfs(int r){
queue<int>q;
q.push(r);
while(!q.empty()){
int cur = q.front();q.pop();
for(auto nxt : adj[cur]){
if(vis[nxt] != 0) continue;
vis[nxt] = 1;
q.push(nxt);
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for(int i = 0; i <m; i++){
char a,b;
cin >> a >> b;
adj[a - toInt].push_back(b - toInt);
Root[b-toInt] = 1;
}
int k = 0;
cin >> k;
vector<int> del;
for(int i = 0; i < k; i++){
char h;
cin >> h;
adj[h-toInt].clear();
del.push_back(h-toInt);
}
for(int i = 1; i <= n; i++){
if(Root[i] == 0){
root = i;
vis[i] = 2;
bfs(i);
}
}
int ans = 0;
for(auto de : del){
vis[de] = 0;
}
for(int i = 1; i <=n; i++){
if(vis[i] == 1)
ans++;
}
cout << ans << '\n';
return 0;
}