Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[최단경로] 2176255 이서연 #347

Open
wants to merge 30 commits into
base: 2176255-이서연
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
cedeb06
[5월 9일] 이분 탐색 과제 코드 업로드
jk0527 May 9, 2023
7699152
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 9, 2023
bbfbc93
[5월 9일] 투 포인터 리드미 업로드
jk0527 May 9, 2023
7baa1de
[5월 10일] 이분 탐색 리드미 수정
jk0527 May 10, 2023
b6f7843
[5월 10일] 투 포인터 강의 자료 업로드
jk0527 May 10, 2023
b92e936
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 10, 2023
56d70ae
[5월 10일] 리드미 수정
jk0527 May 10, 2023
ae608f8
[5월 12일] 투 포인터 라이브 코딩 코드 업로드
jk0527 May 12, 2023
725af3e
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 12, 2023
6846e9e
[5월 12일] 투 포인터 라이브 코딩 코드 업로드
jk0527 May 12, 2023
157d1fc
[5월 12일] 투 포인터 리드미 수정
jk0527 May 12, 2023
077bd1b
[5월 16일] 투 포인터 과제 코드 업로드
jk0527 May 16, 2023
b48257f
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 16, 2023
198416c
[5월 16일] 투 포인터 리드미 수정
jk0527 May 16, 2023
5536b51
[5월 16일] 트리 강의 자료 업로드
jk0527 May 16, 2023
9bf8964
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 16, 2023
cd29d82
[5월 16일] 트리 리드미 업로드
jk0527 May 16, 2023
f5fd534
[5월 16일] 리드미 수정
jk0527 May 16, 2023
5c5694a
[5월 19일] 트리 라이브 코딩 코드 업로드
jk0527 May 19, 2023
cf31227
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 19, 2023
a8cc122
[5월 19일] 트리 리드미 수정
jk0527 May 19, 2023
5ab3590
[5월 23일] 트리 과제 코드 업로드
jk0527 May 23, 2023
20be664
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 23, 2023
dad8d2c
[5월 23일] 트리 리드미 수정
jk0527 May 23, 2023
1373cde
[5월 23일] 최단 경로 강의 자료 업로드
jk0527 May 23, 2023
6d1de48
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 23, 2023
b57dc56
[5월 23일] 최단 경로 리드미 업로드
jk0527 May 23, 2023
c908c33
[5월 23일] 리드미 수정
jk0527 May 23, 2023
6e6196b
[최단경로] 0528
SeoYeomm May 28, 2023
6c77bdc
[최단경로] 0531 - 추가제출
SeoYeomm May 31, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions 13_최단 경로/필수/BOJ_1238.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
typedef pair<int, int> ci;
const int INF = 1e5; // V * (가중치의 최대값)
// X번 마을에 왕복하는 데 가장 오래 걸리는 학생의 시간 출력

// 다익스트라
vector<int> dijkstra(int start, int v, vector<vector<ci>>& graph) {
vector<int> dist(v + 1, INF); // 각 정점까지의 최단 경로 저장
priority_queue<ci, vector<ci>, greater<ci>> pq; // first: 시작점으로부터의 거리, second: 정점

// 시작 정점 초기화
dist[start] = 0;
pq.push({ 0, start });
while (!pq.empty()) {
int weight = pq.top().first; // 현재 정점까지의 경로값
int node = pq.top().second; // 현재 탐색하려는 정점
pq.pop();

if (weight > dist[node]) { // 이미 더 작은 값으로 기록된 정점
continue;
}
for (int i = 0; i < graph[node].size(); i++) {
int next_node = graph[node][i].first; // 연결된 정점
// 시작점으로부터 현재 node를 거쳐 다음 정점까지 가는 경로값
int next_weight = weight + graph[node][i].second;
if (next_weight < dist[next_node]) { // 최단 경로 값이 갱신된다면
dist[next_node] = next_weight;
pq.push({ next_weight, next_node });
}
}
}
return dist;
}

int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);

int N, M, X; // 학생 수, 단방향 도로 수, 모이는 마을 번호
int start, end, T; // 시작점, 끝점, 소요시간 (=가중치)
cin >> N >> M >> X;
vector<vector<ci>> graph(N + 1, vector<ci>(0));

while (M--) {
cin >> start >> end >> T;
graph[start].push_back({ end, T });
}
vector<int> dist_X = dijkstra(X, N, graph); // ( X -> 모든 정점) 최단 시간 저장

int max_time = 0; // 최대 소요시간 초기화
for (int i = 1; i <= N; i++) {
if (i == X) continue; // 모이는 마을은 제외
vector<int> dist_i = dijkstra(i, N, graph); // (학생 위치 i -> X) 최단 시간
max_time = max(max_time, dist_X[i] + dist_i[X]);
// 왕복 시간 = ( X -> 학생 위치 i ) + ( 학생 위치 i -> X )
}
Comment on lines +52 to +60
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💯 👍

cout << max_time;
return 0;
}
56 changes: 56 additions & 0 deletions 13_최단 경로/필수/BOJ_2458.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int INF = 1e9;
// 자신의 키가 몇 번째인지 알 수 있는 학생 수 출력
// 두 학생 사이에 간선 존재 O -> 비교 가능 == 몇 번째인지 알 수 있음
// 간선 존재 X -> 비교 불가능 (가중치가 초기화한 값인 INF로 설정되어있음)

void floydWarshall(int n, vector<vector<int>>& graph) {
for (int k = 1; k <= n; k++) { // 중간 정점
for (int i = 1; i <= n; i++) { // 출발 정점
for (int j = 1; j <= n; j++) { // 도착 정점
// 중간에 k를 거쳐서 i에서 j로 갈 때의 비용
int cost = graph[i][k] + graph[k][j];
// 더 짧은 경로 선택
graph[i][j] = min(graph[i][j], cost);
}
}
}
}

int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);

int N, M; // 학생 수, 비교한 횟수
cin >> N >> M;
vector<vector<int>> graph(N + 1, vector<int>(N + 1, INF));
for (int i = 1; i <= N; i++) { // 자기 자신과의 거리
graph[i][i] = 0;
}

int a, b;
while (M--) {
cin >> a >> b; // a<b == a->b
graph[a][b] = 1; // 두 학생사이의 간선이 있는 경우
}
floydWarshall(N, graph);

int count = 0;
for (int i = 1; i <= N; i++) {
bool check = true; // 비교 가능
for (int j = 1; j <= N; j++) {
if (i != j && graph[i][j] == INF && graph[j][i] == INF) {
// 둘이 같지 않고 가중치가 INF이면
// i번째 학생과 j번째 학생 사이의 경로가 없음
check = false; // 비교 불가능
break;
Comment on lines +45 to +49
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 💯

}
}
if (check) count++;
}
cout << count;
return 0;
}