본문 바로가기
Computer Science

줄 세우기 아메리칸 조식

by OKOK 2019. 3. 5.

1. 위상 정렬

2. 링크드 리스트

3. 큐로 풀이 가능함

4. 디그리 0인가?

5. 아하 그냥 이렇게 풀이 한 것 이구나 


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
#include <stdio.h>
 
struct NODE
{
    int n;
    NODE* next;
};
 
const int MAXN = 50000, MAXM = 150000;
NODE* list[MAXN + 1]; // 각 시작점을 저장함
NODE nPool[MAXM]; // 전체 간선을 저장함
int CHK[MAXN + 1]; // 들어오는 것의 갯수를 저장함
int QUEUE[MAXN];
int wp, rp;
int tc, T, N, M, a, b, s;
 
void process(void)
{
    wp = 0, rp = 0;
    for (int i = 1; i <= N; ++i)
    {
        if (CHK[i] == 0) QUEUE[wp++= i; // 시작점을 찾기
    }
 
    while (rp < wp) // 들어오는 것 없으니, 시작하는 것들
    {
        s = QUEUE[rp++]; 
        for (NODE* n = list[s]; n != NULL; n = n->next)
        {
            if (--CHK[n->n] == 0) QUEUE[wp++= n->n;
        }
    }
}
 
int main(void)
{
    freopen("input.txt""r", stdin);
    for (tc = scanf("%d"&T); tc <= T; ++tc)
    {
        scanf("%d%d"&N, &M);
        for (int i = 0; i < M; ++i)
        {
            scanf("%d%d"&a, &b);
            NODE* n = &nPool[i];
            n->= b, n->next = list[a], list[a] = n;
            ++CHK[b];
        }
        printf("#%d", tc);
        process();
        for (int i = 0; i < wp; ++i) printf(" %d", QUEUE[i]); // 저장된 것 앞으로 나오도록
        for (int i = 1; i <= N; ++i) CHK[i] = 0, list[i] = NULL// 초기화
        puts("");
    }
    return 0;
}
 
cs

 


'Computer Science' 카테고리의 다른 글

Pole 아메리칸 조식  (0) 2019.03.05
파이의 합 아메리칸 조식  (0) 2019.03.05
compare 함수 사용  (0) 2019.02.25
롤러코스터  (0) 2019.02.25
가능한 시험 점수  (0) 2019.02.19

댓글