์ฐ์ ๊ธฐ๋ก ๐ช
[C++ ์๊ณ ๋ฆฌ์ฆ] ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ ๋ณธ๋ฌธ
[C++ ์๊ณ ๋ฆฌ์ฆ] ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ
kite707 2025. 2. 25. 23:24์ด ๊ธ์ ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ตํ๋ฉฐ ์ด๋ ๊ฒ ์ง๋ฉด ์ ์๋ ๊น?๋ฅผ ๊ณ ๋ฏผํ ๊ณผ์ ์ ์์ฑํ ๊ธ์ ๋๋ค.
ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ ์์ฒด๊ฐ ์ฒ์์ด๋ผ๋ฉด ์๋ ๋งํฌ์์ ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ๊ฐ๋ ์ ์ตํ ํ ๊ธ์ ์ฝ์ผ์๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
https://blog.encrypted.gg/1035
[์ค์ ์๊ณ ๋ฆฌ์ฆ] 0x1C๊ฐ - ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ
์๋ ํ์ธ์, ์ด๋ฒ์๋ ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค. ์ด์ ์ต๋จ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ธ ํ๋ก์ด๋, ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๋ง ๋ค๋ฃจ๊ณ ๋๋ฉด ๋๋ฆ ๊ธธ์๋ ๊ทธ๋ํ ํํธ๊ฐ ๋๋ฉ๋๋ค. ๋ชฉ์ฐจ๋ ๋์ผ๋ก ํ ๋ฒ
blog.encrypted.gg
์ต๋จ๊ฑฐ๋ฆฌ
ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ํธ์ด๋ค.
- NxNํฌ๊ธฐ์ ๋ฐฐ์ด์ ํฐ ๊ฐ(INF)์ผ๋ก ์ด๊ธฐํํ๋ค.
- ๊ฐ ์ ์ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ๋ ฅ๋ฐ์ผ๋ฉฐ ๋ฐฐ์ด์ ์ฑ์๋๊ฐ๋ค.
- ๋ชจ๋ ์ ์ ์ ๋ํด ๋ค๋ฅธ ์ ์ ์ ๊ฑฐ์ณ์ ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฒ์ฌํ๋ค. ๋ง์ผ ๋ค๋ฅธ ์ ์ ์ ๊ฑฐ์ณ๊ฐ๊ฒ์ด ์ต๋จ๊ฑฐ๋ฆฌ๋ผ๋ฉด ๊ฐ์ ๊ฐฑ์ ํ๋ค.
๊ทธ๋์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ์ ์์ด๋ค.
#include <iostream>
#include <vector>
#include <algorithm>
#define INF 100000001; //์ ์ ์ด ์ต๋ 100๊ฐ๊ณ ์ ์ ๊ฐ ์ต๋ ๊ธธ์ด๋ 100000์ด๋ 100000*(100-1)๋ณด๋ค ํฐ ๊ฐ์ผ๋ก ์ค์
using namespace std;
int arr[101][101];
int main(){
int N,M;
cin>>N>>M;
for(int i=1;i<=N;i+)fill(&arr[0],&arr[0]+N,INF);
int a,b,cost;
while(M--){
cin>>a>>b>>cost;
arr[a][b]=min(arr[a][b],c);
}
for(int k=1;k<=N;k++){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
arr[i][j]=min(arr[i][j],arr[i][k]+arr[k][j]); //i-j๋ก ์ด๋ํ๋ ๊ฒ๊ณผ i-k,k-j๋ก ์ด๋ํ๋ ๊ฑฐ๋ฆฌ ์ค ์์ ๊ฐ
}
}
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(arr[i][j]==INF)cout<<"X ";
else cout<<arr[i][j]<<" ";
}
cout<<"\n";
}
}
๋๋ ์ฒ์์ ๊ฐ๋ ๋ง ๋ณด๊ณ ์ง์ ์ฝ๋๋ฅผ ์ง๋ดค๋๋ฐ ์ง๊ธ์ฒ๋ผ k i j ์์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์ง ๊ฒ์ด ์๋๋ผ i j k์์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์งฐ์๋ค. ๋น์ฐํ ์ด๋ ๊ฒ ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋์ค๋๋ฐ, ๋ฐ๋ก๋ ์๋์ ๊ฐ๋ค.
5
6
1 2 2
2 4 2
1 4 1
3 4 1
4 5 3
5 1 7
๊ทธ๋ฆผ์์์๋ 2-4-5-1์ ํตํด 2์์ 1๋ก ๋๋ฌํ ์ ์์ง๋ง ์์ ๊ฐ์ด ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๋ฉด 2์์ 1์ ๊ฐ ์ ์๋ค๋ฉฐ X๊ฐ ์ถ๋ ฅ๋๋ค. ๊ทธ ์ด์ ๋ 2์์ 5๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ 5๋ k=4, i=2, j=5์ผ๋ ์ ๋ฐ์ดํธ ๋๊ธฐ ๋๋ฌธ์, 2์์ 1๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์ ๋ฐ์ดํธ ๋์ด์ผํ๋ ์์ ์ธ k=5, i=2, j=1์ผ ๋๋ arr[2][5]๊ฐ์ด INF์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ธฐ์ 2์์ 1๋ก ๋๋ฌํ ์ ์๋ค๊ณ ํ๋จํด๋ฒ๋ฆฐ๋ค.
๊ฒฝ๋ก์ถ์
๊ทธ๋ฆฌ๊ณ ๊ฒฝ๋ก๋ฅผ ์ถ์ ํ๋ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
#include <iostream>
#include <vector>
#include <algorithm>
#define INF 100000001; //์ ์ ์ด ์ต๋ 100๊ฐ๊ณ ์ ์ ๊ฐ ์ต๋ ๊ธธ์ด๋ 100000์ด๋ 100000*(100-1)๋ณด๋ค ํฐ ๊ฐ์ผ๋ก ์ค์
using namespace std;
int arr[101][101];
int nxt[101][101]; //์ถ๊ฐ๋ ๋ถ๋ถ1
int main(){
int N,M;
cin>>N>>M;
for(int i=1;i<=N;i+)fill(&arr[0],&arr[0]+N,INF);
int a,b,cost;
while(M--){
cin>>a>>b>>cost;
arr[a][b]=min(arr[a][b],c);
nxt[a][b]=b; //์ถ๊ฐ๋ ๋ถ๋ถ2
}
for(int k=1;k<=N;k++){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(arr[i][j]>arr[i][k]+arr[k][j]){
arr[i][j]=arr[i][k]+arr[k][j];
nxt[i][j]=nxt[i][k]; //์ถ๊ฐ๋ ๋ถ๋ถ3
}
}
}
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(arr[i][j]==INF)cout<<"X ";
else cout<<arr[i][j]<<" ";
}
cout<<"\n";
}
cout<<"๊ฒฝ๋ก ์ถ๋ ฅ\n"
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(arr[i][j]==0||arr[i][j]==INF)cout<<"0 ";
vector<int> path;
int next=i;
while(next!=j){
path.push_back(next);
next=nxt[next][j];
}
path.push_back(next);
cout<<path.size()<<" ";
for(int i=0;i<path.size();i++){
cout<<path[i]<<" ";
}
}
cout<<"\n";
}
}
๋๋ ์ถ๊ฐ๋ ๋ถ๋ถ 3์ nxt๋ฐฐ์ด์ ๊ฐฑ์ ํ๋ ๋ถ๋ถ์ ์ฒ์์ k๋ก ์ง๊ณ ์ ๋ฌธ์ ๊ฐ ๋๋์ง ๋ชฐ๋์๋ค.
nxt[i][j]=nxt[i][k]; //์ถ๊ฐ๋ ๋ถ๋ถ3
nxt[i][j]=k; //์๋ชป์งฐ๋ ๋ถ๋ถ
์ค๊ฐ์ ๊ฑฐ์ณ๊ฐ๋ ๋
ธ๋๊ฐ 2๊ฐ ์ด์๋ถํฐ๋ nxt๋ฐฐ์ด์ k๋ก ๊ฐฑ์ ํ์ ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ๊ทธ๋ํ๊ฐ ์๋ค๊ณ ํ์.
๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ๋ nxtํ๋ ์๋์ ๊ฐ์ด ์๊ฒผ์ ๊ฒ์ด๋ค.
ํ์ง๋ง nxt๋ฅผ ๊ฐฑ์ ํ ๋ k๋ก ํ๋ค๋ฉด nxtํ๋ ์๋์ ๊ฐ์ด ๋์จ๋ค.
์ด ์ด์ ๋ฅผ ์๊ธฐ ์ํด์๋ ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ป๊ฒ ๋์ํ๊ณ ํ๊ฐ ์ด๋ป๊ฒ ๊ฐฑ์ ๋๋์ง๋ฅผ ์ดํด๋ด์ผ ํ๋ค.
๋จผ์ 1-3์ผ๋ก ๊ฐ๋ ๊ฐ์ ์ต์ด์๋ INF๋ก ๊ธฐ๋ก๋์ด ์์ ๊ฒ์ด๋ค. ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๊ฐ์ด ๊ฐฑ์ ๋๋ ๊ฒ์ ์ค๊ฐ๋
ธ๋(k) 2, ์ถ๋ฐ๋
ธ๋(i) 1, ๋์ฐฉ๋
ธ๋(j) 3์ผ๋ ์ผ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด 1-4๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ ์ธ์ ๊ฐฑ์ ๋ ๊น? 1-4๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ ์ค๊ฐ๋
ธ๋(k) 3, ์ถ๋ฐ๋
ธ๋(i) 1, ๋์ฐฉ๋
ธ๋(j) 4์ผ๋ ๊ฐฑ์ ๋๋ค. ๊ทธ๋ฐ๋ฐ nxt๋ฐฐ์ด์ 1-4๋ก ์ต๋จ๊ฒฝ๋ก๋ก ๊ฐ๊ธฐ ์ํด ๋ค์์ผ๋ก ๊ฐ์ผ ํ ๋
ธ๋๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ k๊ฐ์ธ 3์ด ์๋๋ผ nxt(1)(3), ์ฆ 3์ ๊ฑฐ์น๊ธฐ ์ํด ๋ค์์ผ๋ก ๊ฐ์ผ ํ ๋
ธ๋๋ฅผ ๊ธฐ๋กํด์ผ ํ๋ค. ๊ทธ๋ ๊ธฐ์ nxt(i)(k)๊ฐ์ ๊ธฐ๋กํ๋ ๊ฒ์ด๋ค.
์ฒ์์๋ ์ค๊ฐ๋
ธ๋(k) 2, ์ถ๋ฐ๋
ธ๋(i) 1, ๋์ฐฉ๋
ธ๋(j) 4์ผ๋ ๊ฐฑ์ ๋๋๊ฒ ์๋๊น ํ๊ณ ์๊ฐํ์ง๋ง ๊ฐฑ์ ์กฐ๊ฑด์ ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
for(int k=1;k<=N;k++){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(arr[i][j]>arr[i][k]+arr[k][j]){
arr[i][j]=arr[i][k]+arr[k][j];
nxt[i][j]=nxt[i][k]; //์ถ๊ฐ๋ ๋ถ๋ถ3
}
}
}
}
k=2, i=1, j=4์ผ ๋์๋ arr(1)(4) = INF, arr(i)(k)=1, arr(k)(j)=INF์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ๊ฐฑ์ ๋์ง ์๋๋ค. (arr(2)(4)๋ k๊ฐ 3์ผ๋ ๊ฐฑ์ ๋๋ ์์ง INF์ผ ์์ ์ด๋ค.)
๊ทธ๋ฆผ์ ๋ณด๋ฉด ์๊ฒ ์ง๋ง 1์์ 4๋ก ๊ฐ๊ธฐ ์ํด 3์ผ๋ก ๊ฐ๋ค๊ณ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋กํด๋ฒ๋ฆฌ๋ฉด 2๋ฅผ ์๋ตํ๊ฒ ๋๋ค.
๊ด๋ จ ๋ฌธ์
๊ด๋ จ ๋ฌธ์ ๋ ๋ฐฑ์ค์์ ํ์ด๋ณผ ์ ์๋ค.
https://www.acmicpc.net/problem/11404
https://www.acmicpc.net/problem/11780
'Computer Science > ์๋ฃ๊ตฌ์กฐ & ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++ ์๊ณ ๋ฆฌ์ฆ] LCS, Longest Common Subsequence (0) | 2025.02.20 |
---|---|
[C++ ์๊ณ ๋ฆฌ์ฆ] ๋ฌดํฅ๊ทธ๋ํ ์ฌ์ดํด dfs (0) | 2025.01.21 |
[C++ ์๊ณ ๋ฆฌ์ฆ] ํต์ ๋ ฌ (2) | 2024.11.26 |
[C++] ๋ฒกํฐ ํ์ (0) | 2021.09.07 |
[C++] ์ซ์ ์๋ฆฟ์ ๋ํ๊ธฐ (0) | 2021.09.07 |