-
Notifications
You must be signed in to change notification settings - Fork 37
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
SeoYeomm
wants to merge
30
commits into
Altu-Bitu-Official:2176255-이서연
Choose a base branch
from
SeoYeomm:13-assignment
base: 2176255-이서연
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
[최단경로] 2176255 이서연 #347
Changes from 1 commit
Commits
Show all changes
30 commits
Select commit
Hold shift + click to select a range
cedeb06
[5월 9일] 이분 탐색 과제 코드 업로드
jk0527 7699152
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 bbfbc93
[5월 9일] 투 포인터 리드미 업로드
jk0527 7baa1de
[5월 10일] 이분 탐색 리드미 수정
jk0527 b6f7843
[5월 10일] 투 포인터 강의 자료 업로드
jk0527 b92e936
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 56d70ae
[5월 10일] 리드미 수정
jk0527 ae608f8
[5월 12일] 투 포인터 라이브 코딩 코드 업로드
jk0527 725af3e
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 6846e9e
[5월 12일] 투 포인터 라이브 코딩 코드 업로드
jk0527 157d1fc
[5월 12일] 투 포인터 리드미 수정
jk0527 077bd1b
[5월 16일] 투 포인터 과제 코드 업로드
jk0527 b48257f
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 198416c
[5월 16일] 투 포인터 리드미 수정
jk0527 5536b51
[5월 16일] 트리 강의 자료 업로드
jk0527 9bf8964
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 cd29d82
[5월 16일] 트리 리드미 업로드
jk0527 f5fd534
[5월 16일] 리드미 수정
jk0527 5c5694a
[5월 19일] 트리 라이브 코딩 코드 업로드
jk0527 cf31227
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 a8cc122
[5월 19일] 트리 리드미 수정
jk0527 5ab3590
[5월 23일] 트리 과제 코드 업로드
jk0527 20be664
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 dad8d2c
[5월 23일] 트리 리드미 수정
jk0527 1373cde
[5월 23일] 최단 경로 강의 자료 업로드
jk0527 6d1de48
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 b57dc56
[5월 23일] 최단 경로 리드미 업로드
jk0527 c908c33
[5월 23일] 리드미 수정
jk0527 6e6196b
[최단경로] 0528
SeoYeomm 6c77bdc
[최단경로] 0531 - 추가제출
SeoYeomm File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 ) | ||
} | ||
cout << max_time; | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 💯 |
||
} | ||
} | ||
if (check) count++; | ||
} | ||
cout << count; | ||
return 0; | ||
} |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💯 👍