작성자 없음
작성자 정보가 삭제된 글입니다.
해결된 질문
작성
·
476
0
(arr은 선생님 코드의 dp와 같습니다, dfs는 본인이 아닌 자식노드부터 세는 것으로 잡았습니다.)
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <climits>
using namespace std;
int n, m, a, b, maxN = INT_MIN;
vector<int> v[10004];
int arr[10004];
int dfs(int here) {
int ret = 0;
if(v[here].size()==0) return 0;
for(int there : v[here]) {
ret++;
ret += dfs(there);
}
return ret;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> n >> m;
for(int i = 0; i < m; i++) {
cin >> a >> b;
v[b].push_back(a);
}
for(int i = 1; i <= n; i++) {
arr[i] = dfs(i);
maxN = max(maxN, arr[i]);
}
for(int i = 1; i <= n; i++) {
if(arr[i] == maxN) cout << i << ' ';
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#include <climits>
#include <cstring>
using namespace std;
// visited 배열 삽입
int n, m, a, b, visited[10004], maxN = INT_MIN;
vector<int> v[10004];
int arr[10004];
int dfs(int here) {
visited[here] = 1;
int ret = 0;
if(v[here].size()==0) return 0;
for(int there : v[here]) {
if(visited[there]) continue;
ret++;
ret += dfs(there);
}
return ret;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> n >> m;
for(int i = 0; i < m; i++) {
cin >> a >> b;
v[b].push_back(a);
}
for(int i = 1; i <= n; i++) {
memset(visited, 0, sizeof(visited));
arr[i] = dfs(i);
maxN = max(maxN, arr[i]);
}
for(int i = 1; i <= n; i++) {
if(arr[i] == maxN) cout << i << ' ';
}
return 0;
}
답변 1
0
안녕하세요. yunbinni님ㅎㅎ
먼저 2주차 강의를 한번 더 보시는 것을 추천드리구요.
제가 질문하나 드리겠습니다.
visited 없이 "방문한 정점을 다시 방문하지 않기"를 어떻게 구현하실건가요?
만약 DAG tree형태라면 어느정도는 가능하지만 이 문제는 "그래프"인데요.
visited는 "방문한 정점을 다시 방문하지 않기 위한 장치" 인 것입니다.
visited 배열을 걸어서 한 것과 안한것을
int dfs(int here) {
cout << here << '\n';
int ret = 0;
이런식으로 이부분에 here 디버깅을 통해 어느 정점들을 방문하는지 확인해보시면 금방 어떤 느낌인지 알 수 있으실겁니다.
또 질문사항있으시면 언제든 말씀 부탁드립니다.
감사합니다.
강사 큰돌 올림.