Skip to content

Commit 67be43e

Browse files
committed
Update
1 parent d26e6cc commit 67be43e

File tree

5 files changed

+331
-0
lines changed

5 files changed

+331
-0
lines changed

9/1.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#include <bits/stdc++.h>
2+
#define INF 1e9 // 무한을 의미하는 값으로 10억을 설정
3+
4+
using namespace std;
5+
6+
// 노드의 개수(N), 간선의 개수(M), 시작 노드 번호(Start)
7+
// 노드의 개수는 최대 100,000개라고 가정
8+
int n, m, start;
9+
// 각 노드에 연결되어 있는 노드에 대한 정보를 담는 배열
10+
vector<pair<int, int> > graph[100001];
11+
// 방문한 적이 있는지 체크하는 목적의 배열 만들기
12+
bool visited[100001];
13+
// 최단 거리 테이블 만들기
14+
int d[100001];
15+
16+
// 방문하지 않은 노드 중에서, 가장 최단 거리가 짧은 노드의 번호를 반환
17+
int getSmallestNode() {
18+
int min_value = INF;
19+
int index = 0; // 가장 최단 거리가 짧은 노드(인덱스)
20+
for (int i = 1; i <= n; i++) {
21+
if (d[i] < min_value && !visited[i]) {
22+
min_value = d[i];
23+
index = i;
24+
}
25+
}
26+
return index;
27+
}
28+
29+
void dijkstra(int start) {
30+
// 시작 노드에 대해서 초기화
31+
d[start] = 0;
32+
visited[start] = true;
33+
for (int j = 0; j < graph[start].size(); j++) {
34+
d[graph[start][j].first] = graph[start][j].second;
35+
}
36+
// 시작 노드를 제외한 전체 n - 1개의 노드에 대해 반복
37+
for (int i = 0; i < n - 1; i++) {
38+
// 현재 최단 거리가 가장 짧은 노드를 꺼내서, 방문 처리
39+
int now = getSmallestNode();
40+
visited[now] = true;
41+
// 현재 노드와 연결된 다른 노드를 확인
42+
for (int j = 0; j < graph[now].size(); j++) {
43+
int cost = d[now] + graph[now][j].second;
44+
// 현재 노드를 거쳐서 다른 노드로 이동하는 거리가 더 짧은 경우
45+
if (cost < d[graph[now][j].first]) {
46+
d[graph[now][j].first] = cost;
47+
}
48+
}
49+
}
50+
}
51+
52+
int main(void) {
53+
cin >> n >> m >> start;
54+
55+
// 모든 간선 정보를 입력받기
56+
for (int i = 0; i < m; i++) {
57+
int a, b, c;
58+
cin >> a >> b >> c;
59+
// a번 노드에서 b번 노드로 가는 비용이 c라는 의미
60+
graph[a].push_back({b, c});
61+
}
62+
63+
// 최단 거리 테이블을 모두 무한으로 초기화
64+
fill_n(d, 100001, INF);
65+
66+
// 다익스트라 알고리즘을 수행
67+
dijkstra(start);
68+
69+
// 모든 노드로 가기 위한 최단 거리를 출력
70+
for (int i = 1; i <= n; i++) {
71+
// 도달할 수 없는 경우, 무한(INFINITY)이라고 출력
72+
if (d[i] == INF) {
73+
cout << "INFINITY" << '\n';
74+
}
75+
// 도달할 수 있는 경우 거리를 출력
76+
else {
77+
cout << d[i] << '\n';
78+
}
79+
}
80+
}

9/2.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include <bits/stdc++.h>
2+
#define INF 1e9 // 무한을 의미하는 값으로 10억을 설정
3+
4+
using namespace std;
5+
6+
// 노드의 개수(N), 간선의 개수(M), 시작 노드 번호(Start)
7+
// 노드의 개수는 최대 100,000개라고 가정
8+
int n, m, start;
9+
// 각 노드에 연결되어 있는 노드에 대한 정보를 담는 배열
10+
vector<pair<int, int> > graph[100001];
11+
// 최단 거리 테이블 만들기
12+
int d[100001];
13+
14+
void dijkstra(int start) {
15+
priority_queue<pair<int, int> > pq;
16+
// 시작 노드로 가기 위한 최단 경로는 0으로 설정하여, 큐에 삽입
17+
pq.push({0, start});
18+
d[start] = 0;
19+
while (!pq.empty()) { // 큐가 비어있지 않다면
20+
// 가장 최단 거리가 짧은 노드에 대한 정보 꺼내기
21+
int dist = -pq.top().first; // 현재 노드까지의 비용
22+
int now = pq.top().second; // 현재 노드
23+
pq.pop();
24+
// 현재 노드가 이미 처리된 적이 있는 노드라면 무시
25+
if (d[now] < dist) continue;
26+
// 현재 노드와 연결된 다른 인접한 노드들을 확인
27+
for (int i = 0; i < graph[now].size(); i++) {
28+
int cost = dist + graph[now][i].second;
29+
// 현재 노드를 거쳐서, 다른 노드로 이동하는 거리가 더 짧은 경우
30+
if (cost < d[graph[now][i].first]) {
31+
d[graph[now][i].first] = cost;
32+
pq.push(make_pair(-cost, graph[now][i].first));
33+
}
34+
}
35+
}
36+
}
37+
38+
int main(void) {
39+
cin >> n >> m >> start;
40+
41+
// 모든 간선 정보를 입력받기
42+
for (int i = 0; i < m; i++) {
43+
int a, b, c;
44+
cin >> a >> b >> c;
45+
// a번 노드에서 b번 노드로 가는 비용이 c라는 의미
46+
graph[a].push_back({b, c});
47+
}
48+
49+
// 최단 거리 테이블을 모두 무한으로 초기화
50+
fill(d, d + 100001, INF);
51+
52+
// 다익스트라 알고리즘을 수행
53+
dijkstra(start);
54+
55+
// 모든 노드로 가기 위한 최단 거리를 출력
56+
for (int i = 1; i <= n; i++) {
57+
// 도달할 수 없는 경우, 무한(INFINITY)이라고 출력
58+
if (d[i] == INF) {
59+
cout << "INFINITY" << '\n';
60+
}
61+
// 도달할 수 있는 경우 거리를 출력
62+
else {
63+
cout << d[i] << '\n';
64+
}
65+
}
66+
}

9/3.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#include <bits/stdc++.h>
2+
#define INF 1e9 // 무한을 의미하는 값으로 10억을 설정
3+
4+
using namespace std;
5+
6+
// 노드의 개수(N), 간선의 개수(M)
7+
// 노드의 개수는 최대 500개라고 가정
8+
int n, m;
9+
// 2차원 배열(그래프 표현)를 만들기
10+
int graph[501][501];
11+
12+
int main(void) {
13+
cin >> n >> m;
14+
15+
// 최단 거리 테이블을 모두 무한으로 초기화
16+
for (int i = 0; i < 501; i++) {
17+
fill(graph[i], graph[i] + 501, INF);
18+
}
19+
20+
// 자기 자신에서 자기 자신으로 가는 비용은 0으로 초기화
21+
for (int a = 1; a <= n; a++) {
22+
for (int b = 1; b <= n; b++) {
23+
if (a == b) graph[a][b] = 0;
24+
}
25+
}
26+
27+
// 각 간선에 대한 정보를 입력 받아, 그 값으로 초기화
28+
for (int i = 0; i < m; i++) {
29+
// A에서 B로 가는 비용은 C라고 설정
30+
int a, b, c;
31+
cin >> a >> b >> c;
32+
graph[a][b] = c;
33+
}
34+
35+
// 점화식에 따라 플로이드 워셜 알고리즘을 수행
36+
for (int k = 1; k <= n; k++) {
37+
for (int a = 1; a <= n; a++) {
38+
for (int b = 1; b <= n; b++) {
39+
graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b]);
40+
}
41+
}
42+
}
43+
44+
// 수행된 결과를 출력
45+
for (int a = 1; a <= n; a++) {
46+
for (int b = 1; b <= n; b++) {
47+
// 도달할 수 없는 경우, 무한(INFINITY)이라고 출력
48+
if (graph[a][b] == INF) {
49+
cout << "INFINITY" << ' ';
50+
}
51+
// 도달할 수 있는 경우 거리를 출력
52+
else {
53+
cout << graph[a][b] << ' ';
54+
}
55+
}
56+
cout << '\n';
57+
}
58+
}

9/4.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#include <bits/stdc++.h>
2+
#define INF 1e9 // 무한을 의미하는 값으로 10억을 설정
3+
4+
using namespace std;
5+
6+
// 노드의 개수(N), 간선의 개수(M)
7+
int n, m;
8+
// 2차원 배열(그래프 표현)를 만들기
9+
int graph[101][101];
10+
11+
int main(void) {
12+
cin >> n >> m;
13+
14+
// 최단 거리 테이블을 모두 무한으로 초기화
15+
for (int i = 0; i < 101; i++) {
16+
fill(graph[i], graph[i] + 101, INF);
17+
}
18+
19+
// 자기 자신에서 자기 자신으로 가는 비용은 0으로 초기화
20+
for (int a = 1; a <= n; a++) {
21+
for (int b = 1; b <= n; b++) {
22+
if (a == b) graph[a][b] = 0;
23+
}
24+
}
25+
26+
// 각 간선에 대한 정보를 입력 받아, 그 값으로 초기화
27+
for (int i = 0; i < m; i++) {
28+
// A와 B가 서로에게 가는 비용은 1이라고 설정
29+
int a, b;
30+
cin >> a >> b;
31+
graph[a][b] = 1;
32+
graph[b][a] = 1;
33+
}
34+
35+
// 거쳐 갈 노드 X와 최종 목적지 노드 K를 입력받기
36+
int x, k;
37+
cin >> x >> k;
38+
39+
// 점화식에 따라 플로이드 워셜 알고리즘을 수행
40+
for (int k = 1; k <= n; k++) {
41+
for (int a = 1; a <= n; a++) {
42+
for (int b = 1; b <= n; b++) {
43+
graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b]);
44+
}
45+
}
46+
}
47+
48+
// 수행된 결과를 출력
49+
int distance = graph[1][k] + graph[k][x];
50+
51+
// 도달할 수 없는 경우, -1을 출력
52+
if (distance >= INF) {
53+
cout << "-1" << '\n';
54+
}
55+
// 도달할 수 있다면, 최단 거리를 출력
56+
else {
57+
cout << distance << '\n';
58+
}
59+
}

9/5.cpp

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include <bits/stdc++.h>
2+
#define INF 1e9 // 무한을 의미하는 값으로 10억을 설정
3+
4+
using namespace std;
5+
6+
// 노드의 개수(N), 간선의 개수(M), 시작 노드 번호(Start)
7+
int n, m, start;
8+
// 각 노드에 연결되어 있는 노드에 대한 정보를 담는 배열
9+
vector<pair<int, int> > graph[30001];
10+
// 최단 거리 테이블 만들기
11+
int d[30001];
12+
13+
void dijkstra(int start) {
14+
priority_queue<pair<int, int> > pq;
15+
// 시작 노드로 가기 위한 최단 경로는 0으로 설정하여, 큐에 삽입
16+
pq.push({0, start});
17+
d[start] = 0;
18+
while (!pq.empty()) { // 큐가 비어있지 않다면
19+
// 가장 최단 거리가 짧은 노드에 대한 정보 꺼내기
20+
int dist = -pq.top().first; // 현재 노드까지의 비용
21+
int now = pq.top().second; // 현재 노드
22+
pq.pop();
23+
// 현재 노드가 이미 처리된 적이 있는 노드라면 무시
24+
if (d[now] < dist) continue;
25+
// 현재 노드와 연결된 다른 인접한 노드들을 확인
26+
for (int i = 0; i < graph[now].size(); i++) {
27+
int cost = dist + graph[now][i].second;
28+
// 현재 노드를 거쳐서, 다른 노드로 이동하는 거리가 더 짧은 경우
29+
if (cost < d[graph[now][i].first]) {
30+
d[graph[now][i].first] = cost;
31+
pq.push(make_pair(-cost, graph[now][i].first));
32+
}
33+
}
34+
}
35+
}
36+
37+
int main(void) {
38+
cin >> n >> m >> start;
39+
40+
// 모든 간선 정보를 입력받기
41+
for (int i = 0; i < m; i++) {
42+
int x, y, z;
43+
cin >> x >> y >> z;
44+
// X번 노드에서 Y번 노드로 가는 비용이 Z라는 의미
45+
graph[x].push_back({y, z});
46+
}
47+
48+
// 최단 거리 테이블을 모두 무한으로 초기화
49+
fill(d, d + 30001, INF);
50+
51+
// 다익스트라 알고리즘을 수행
52+
dijkstra(start);
53+
54+
// 도달할 수 있는 노드의 개수
55+
int count = 0;
56+
// 도달할 수 있는 노드 중에서, 가장 멀리 있는 노드와의 최단 거리
57+
int maxDistance = 0;
58+
for (int i = 1; i <= n; i++) {
59+
// 도달할 수 있는 노드인 경우
60+
if (d[i] != INF) {
61+
count += 1;
62+
maxDistance = max(maxDistance, d[i]);
63+
}
64+
}
65+
66+
// 시작 노드는 제외해야 하므로 count - 1을 출력
67+
cout << count - 1 << ' ' << maxDistance << '\n';
68+
}

0 commit comments

Comments
 (0)