문제: icpc.me/9470
indegree가 0인 노드들의 순서가 1인데 어떤 노드의 indegree와 연결된 노드 중 순서가 가장 큰 값을 i라고할 때 i가 1개 들어오면 해당 노드의 순서는 i 2개 이상 들어온다면 해당 노드의 순서는 i+1이 된다.
우리는 indegree의 정보를 이용하여 위상정렬을 실행하는데 이때 들어오는 indegree의 최댓값과 개수만 count해주어 값을 갱신해주면 된다.
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 | #include <cstdio> #include <algorithm> #include <vector> #include <cstring> #include <queue> using namespace std; int k, m, p, s, x, y, in[1001], r[1001], c[1001], res; vector<vector<int>> vt; int main() { scanf("%d", &k); while (k--) { vt.clear(); scanf("%d%d%d", &s, &m, &p); vt.resize(m + 1); memset(in, 0, sizeof(in)); memset(c, 0, sizeof(c)); memset(r, 0, sizeof(r)); res = 0; for (int i = 0; i < p; i++) { scanf("%d%d", &x, &y); vt[x].push_back(y); in[y]++; } queue<int> qu; for (int i = 1; i <= m; i++) { if (!in[i]) { r[i] = 1; qu.push(i); } } while (qu.size()) { int here = qu.front(); qu.pop(); if (c[here] > 0)r[here]++; res = max(r[here], res); for (auto there : vt[here]) { if (r[there] < r[here]) { r[there] = r[here]; c[there] = 0; } else if (r[there] == r[here]) c[there]++; in[there]--; if (!in[there]) qu.push(there); } } printf("%d %d\n", s, res); } return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)3665 최종 순위 (2) | 2017.01.22 |
---|---|
BOJ)2637 장난감조립 (0) | 2017.01.22 |
BOJ)13711 LCS4 (0) | 2017.01.22 |
BOJ)1183 약속 (0) | 2017.01.22 |
BOJ)2150 Strongly Connected Component (0) | 2017.01.21 |