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 | #include <stdio.h> #include <vector> #include <queue> using namespace std; int indegree[10005] = { 0 }; int visit[10005] = { 0 }; vector<vector<int> > vec(10005); queue<int> q; int dptMax[10005] = { 0 }; void dfs(int x) { if (vec[x].size() == 0) return; for (int i = 0; i < vec[x].size(); i++) { indegree[vec[x][i]]--; if (dptMax[vec[x][i]] < dptMax[x]+1) dptMax[vec[x][i]] = dptMax[x]+1; if (indegree[vec[x][i]] == 0) dfs(vec[x][i]); } } int main() { int a, b; while (scanf("%d %d", &a, &b) != EOF) { vec[a].push_back(b); indegree[b]++; visit[a]++; visit[b]++; } for (int i = 1; i <= 10005; i++) { if (indegree[i] == 0 && visit[i] != 0) { dfs(i); } } int maxVal = 0; for (int i = 1; i < 10005; i++) { if (dptMax[i] > maxVal) maxVal = dptMax[i]; } printf("%d", maxVal); } | cs |
알고리즘/위상정렬