Skip to content

Commit 96aa6f1

Browse files
committed
Update
1 parent 36582b4 commit 96aa6f1

File tree

3 files changed

+183
-0
lines changed

3 files changed

+183
-0
lines changed

10/7.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
// 노드의 개수(N)와 연산의 개수(M)
6+
int n, m;
7+
int parent[100001]; // 부모 테이블 초기화
8+
9+
// 특정 원소가 속한 집합을 찾기
10+
int findParent(int x) {
11+
// 루트 노드가 아니라면, 루트 노드를 찾을 때까지 재귀적으로 호출
12+
if (x == parent[x]) return x;
13+
return parent[x] = findParent(parent[x]);
14+
}
15+
16+
// 두 원소가 속한 집합을 합치기
17+
void unionParent(int a, int b) {
18+
a = findParent(a);
19+
b = findParent(b);
20+
if (a < b) parent[b] = a;
21+
else parent[a] = b;
22+
}
23+
24+
int main(void) {
25+
cin >> n >> m;
26+
27+
// 부모 테이블상에서, 부모를 자기 자신으로 초기화
28+
for (int i = 1; i <= n; i++) {
29+
parent[i] = i;
30+
}
31+
32+
// 각 연산을 하나씩 확인
33+
for (int i = 0; i < m; i++) {
34+
int oper, a, b;
35+
cin >> oper >> a >> b;
36+
// 합집합(Union) 연산인 경우
37+
if (oper == 0) {
38+
unionParent(a, b);
39+
}
40+
// 찾기(Find) 연산인 경우
41+
else if (oper == 1) {
42+
if (findParent(a) == findParent(b)) {
43+
cout << "YES" << '\n';
44+
}
45+
else {
46+
cout << "NO" << '\n';
47+
}
48+
}
49+
}
50+
}

10/8.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
// 노드의 개수와 간선(Union 연산)의 개수 입력받기
6+
int v, e;
7+
int parent[100001]; // 부모 테이블 초기화
8+
// 모든 간선을 담을 리스트와, 최종 비용을 담을 변수
9+
vector<pair<int, pair<int, int> > > edges;
10+
int result = 0;
11+
12+
// 특정 원소가 속한 집합을 찾기
13+
int findParent(int x) {
14+
// 루트 노드가 아니라면, 루트 노드를 찾을 때까지 재귀적으로 호출
15+
if (x == parent[x]) return x;
16+
return parent[x] = findParent(parent[x]);
17+
}
18+
19+
// 두 원소가 속한 집합을 합치기
20+
void unionParent(int a, int b) {
21+
a = findParent(a);
22+
b = findParent(b);
23+
if (a < b) parent[b] = a;
24+
else parent[a] = b;
25+
}
26+
27+
int main(void) {
28+
cin >> v >> e;
29+
30+
// 부모 테이블상에서, 부모를 자기 자신으로 초기화
31+
for (int i = 1; i <= v; i++) {
32+
parent[i] = i;
33+
}
34+
35+
// 모든 간선에 대한 정보를 입력 받기
36+
for (int i = 0; i < e; i++) {
37+
int a, b, cost;
38+
cin >> a >> b >> cost;
39+
// 비용순으로 정렬하기 위해서 튜플의 첫 번째 원소를 비용으로 설정
40+
edges.push_back({cost, {a, b}});
41+
}
42+
43+
// 간선을 비용순으로 정렬
44+
sort(edges.begin(), edges.end());
45+
int last = 0; // 최소 신장 트리에 포함되는 간선 중에서 가장 비용이 큰 간선
46+
47+
// 간선을 하나씩 확인하며
48+
for (int i = 0; i < edges.size(); i++) {
49+
int cost = edges[i].first;
50+
int a = edges[i].second.first;
51+
int b = edges[i].second.second;
52+
// 사이클이 발생하지 않는 경우에만 집합에 포함
53+
if (findParent(a) != findParent(b)) {
54+
unionParent(a, b);
55+
result += cost;
56+
last = cost;
57+
}
58+
}
59+
60+
cout << result - last << '\n';
61+
}

10/9.cpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
// 노드의 개수(V)
6+
int v;
7+
// 모든 노드에 대한 진입차수는 0으로 초기화
8+
int indegree[501];
9+
// 각 노드에 연결된 간선 정보를 담기 위한 연결 리스트 초기화
10+
vector<int> graph[501];
11+
// 각 강의 시간을 0으로 초기화
12+
int times[501];
13+
14+
// 위상 정렬 함수
15+
void topologySort() {
16+
vector<int> result(501); // 알고리즘 수행 결과를 담을 리스트
17+
for (int i = 1; i <= v; i++) {
18+
result[i] = times[i];
19+
}
20+
21+
queue<int> q; // 큐 라이브러리 사용
22+
23+
// 처음 시작할 때는 진입차수가 0인 노드를 큐에 삽입
24+
for (int i = 1; i <= v; i++) {
25+
if (indegree[i] == 0) {
26+
q.push(i);
27+
}
28+
}
29+
30+
// 큐가 빌 때까지 반복
31+
while (!q.empty()) {
32+
// 큐에서 원소 꺼내기
33+
int now = q.front();
34+
q.pop();
35+
result.push_back(now);
36+
// 해당 원소와 연결된 노드들의 진입차수에서 1 빼기
37+
for (int i = 0; i < graph[now].size(); i++) {
38+
result[graph[now][i]] = max(result[graph[now][i]], result[now] + times[graph[now][i]]);
39+
indegree[graph[now][i]] -= 1;
40+
// 새롭게 진입차수가 0이 되는 노드를 큐에 삽입
41+
if (indegree[graph[now][i]] == 0) {
42+
q.push(graph[now][i]);
43+
}
44+
}
45+
}
46+
47+
// 위상 정렬을 수행한 결과 출력
48+
for (int i = 1; i <= v; i++) {
49+
cout << result[i] << '\n';
50+
}
51+
}
52+
53+
int main(void) {
54+
cin >> v;
55+
56+
// 방향 그래프의 모든 간선 정보를 입력받기
57+
for (int i = 1; i <= v; i++) {
58+
// 첫 번째 수는 시간 정보를 담고 있음
59+
int x;
60+
cin >> x;
61+
times[i] = x;
62+
// 해당 강의를 듣기 위해 먼저 들어야 하는 강의들의 번호 입력
63+
while (true) {
64+
cin >> x;
65+
if (x == -1) break;
66+
indegree[i] += 1;
67+
graph[x].push_back(i);
68+
}
69+
}
70+
71+
topologySort();
72+
}

0 commit comments

Comments
 (0)