[[problem:ORDERING]] 문제를 풀고 있습니다.
간단한 위상정렬 문제라고 생각했는데..
사전순 배열이 한번 발목을 잡더니..
예제 케이스는 모두 맞는데 저지에서 오답이 자꾸 나오네요;
모든 작업을 수행할 수 있다고 가정한다는 것은
cycle 이 없다고 하는것이라 생각했는데, 그 생각이 틀린건지..
도움 부탁 드리며.. 미리 감사드립니다.
사전순 배열을 위해 간선이 존재하는 노드를 찾는 반복문이
A가 아닌 Z부터 찾기 시작하는 것 빼고는 일반적인 위상정렬입니다.
~~~ c++
#include
using namespace std;
int N;
int M;
int ADJ[26][26];
bool VISITED[26];
int ORDER[26];
int COUNT;
void dfs(int here)
{
VISITED[here] = true;
for (int there = N - 1; there >= 0; there--) {
if (ADJ[here][there] && !VISITED[there]) {
dfs(there);
}
}
ORDER[COUNT++] = here;
}
void makeGraph()
{
for (int i = 0; i < M; i++) {
char first, second;
if (N == 1) {
cin >> first;
second = first;
} else {
cin >> first >> second;
}
ADJ[first - 'A'][second - 'A'] = 1;
}
}
void dfsAll()
{
for (int i = N - 1; i >= 0; i--) {
if (!VISITED[i])
dfs(i);
}
}
void init()
{
COUNT = 0;
for (int i = 0; i < 26; i++)
for (int j = 0; j < 26; j++)
ADJ[i][j] = 0;
for (int i = 0; i < 26; i++) {
VISITED[i] = false;
ORDER[i] = -1;
}
}
int main(int c, char **v)
{
ios_base::sync_with_stdio();
int C;
cin >> C;
while (C--) {
cin >> N >> M;
init();
makeGraph();
dfsAll();
for (int i = COUNT - 1; i >= 0; i--)
cout << (char)(ORDER[i] + 'A');
cout << endl;
}
return 0;
}
sancho
[[problem:ORDERING]] 문제를 풀고 있습니다.
간단한 위상정렬 문제라고 생각했는데..
사전순 배열이 한번 발목을 잡더니..
예제 케이스는 모두 맞는데 저지에서 오답이 자꾸 나오네요;
모든 작업을 수행할 수 있다고 가정한다는 것은
cycle 이 없다고 하는것이라 생각했는데, 그 생각이 틀린건지..
도움 부탁 드리며.. 미리 감사드립니다.
사전순 배열을 위해 간선이 존재하는 노드를 찾는 반복문이
A가 아닌 Z부터 찾기 시작하는 것 빼고는 일반적인 위상정렬입니다.
~~~ c++
#include
using namespace std;
int N;
int M;
int ADJ[26][26];
bool VISITED[26];
int ORDER[26];
int COUNT;
void dfs(int here)
{
VISITED[here] = true;
for (int there = N - 1; there >= 0; there--) {
if (ADJ[here][there] && !VISITED[there]) {
dfs(there);
}
}
ORDER[COUNT++] = here;
}
void makeGraph()
{
for (int i = 0; i < M; i++) {
char first, second;
if (N == 1) {
cin >> first;
second = first;
} else {
cin >> first >> second;
}
ADJ[first - 'A'][second - 'A'] = 1;
}
}
void dfsAll()
{
for (int i = N - 1; i >= 0; i--) {
if (!VISITED[i])
dfs(i);
}
}
void init()
{
COUNT = 0;
for (int i = 0; i < 26; i++)
for (int j = 0; j < 26; j++)
ADJ[i][j] = 0;
for (int i = 0; i < 26; i++) {
VISITED[i] = false;
ORDER[i] = -1;
}
}
int main(int c, char **v)
{
ios_base::sync_with_stdio();
int C;
cin >> C;
while (C--) {
cin >> N >> M;
init();
makeGraph();
dfsAll();
for (int i = COUNT - 1; i >= 0; i--)
cout << (char)(ORDER[i] + 'A');
cout << endl;
}
return 0;
}
11년 전