본문 바로가기

위상정렬9

cf #656 div3 E - Directing Edges(위상정렬, 사이클 유무) https://codeforces.com/contest/1385/problem/E 방향그래프와 무향그래프가 섞인 그래프에서 위상정렬을 구해야 해서 헷갈렸다. 위상정렬 결과로 사이클 판단하는 방법도 숙지해 뒀어야 하는 문제 정점u,v사이엔 최대 하나의 무향또는 유향간선만 존재하는 그래프가 주어진다. 유향간선을 적절히 조정해서 accyclic그래프를 만들 수 있다면 그 간선들을 출력하라 손으로 좀 그리다보면 유향간선만 가지고 사이클이 존재하지 않는다면 항상 정답이 존재함을 알 수 있다. 유향간선 기준 ind로 topological sort를 한 순서벡터로 각 정점마다 순서를 매긴다. 유향간선 u->v 중 rank[u]>rank[v]인 경우가 존재하면 사이클이 있다는 것 의미함. 사이클이 없다면 ,모든 간선을.. 2020. 7. 20.
BOJ 15758 - Milking order (이분탐색, 위상정렬) https://www.acmicpc.net/problem/15758 최대 5만개의 법칙 M개가 주어진다. 법칙마다 순서가 주어진다. 예를들어 1 4 3이면 최종 결과에 1 4 3 이 순서대로 나타나야 한다. 앞에서부터 최대한 많은 법칙을 사용해서 유효한 n의 permutation을 만들고자 할 때, n의 permutation을 구하라. 앞에서부터 법칙 1개 ~ m개를 만족할 때에 대해 가능한지 이분탐색한다. bool pos(int k) 함수에서 앞에서부터 k개의 법칙을 이용해서 위상정렬 가능한지 반환하면 된다. 단, 가능한 수열 중 사전 순으로 가장 앞선 수열을 출력해야하므로 위상정렬시 pq를 쓰면 된다. int n, m, ind[MAX]; vector odr[50004]; vector topo; vec.. 2020. 3. 1.
DICTIONARY - 고대어 사전 (위상정렬) https://algospot.com/judge/problem/read/DICTIONARY 위상정렬 기본예제. dfs로 위상정렬 순서 정해주는 것 기록용 알파벳의 순서를 그래프로 표현하여 사이클이 있다면 INVALID 출력, 없다면 위상정렬된 순서로 출력 생략. dfs부분 유념 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define FAST ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); using namespace std; typedef lon.. 2020. 2. 12.
CSES PS - investigation (다익스트라, 위상정렬) https://cses.fi/problemset/task/1202 볼륨이 크다. 사이클이 허용된 가중치가 있는 방향그래프가 주어진다. 시작점 1에서 끝점 n까지 최소 비용으로 이동할 때, (1)그 비용 (2) 가능한 경로의 수, (3) 가능한 경로 중 가장 적은 간선을 지나치는 경우 그 간선의 수, (4) 가장 많은 간선을 지나는 경우 그 간선의 수. (1),(2),(3),(4)를 모두 구하는 문제 (1)은 다익스트라로 풀 수 있고, (2),(3),(4)는 DAG일 때 dp로 풀 수 있는 내용이다. 사이클이 있는 그래프라고 해도 최소비용으로 이동하는 경로는 항상 DAG임이 분명하다. 1. 주어진 그래프에서 유효한 즉, 최소비용 경로에 해당하는 간선들만 남겨서 DAG를 만든다. dist(1~u) + w +.. 2020. 1. 29.