Floyd's Algorithm

marshmelody·2023년 11월 17일
0

학교에서 Floyd's 알고리즘을 배웠고, 과제로 자유로운 언어로 해당 알고리즘을 구현하는 것이 나왔다. 나는 C++를 이용했다.

#include <iostream>
#include <vector>
using namespace std;

const int num = 5;
const int NON = 10000;
vector<vector<int>> W = {
	{0,3,6,NON,4},
	{NON,0,2,NON,4},
	{5,1,0,2,NON},
	{NON,5,NON,0,1},
	{NON,NON,NON,3,0}
};
vector<vector<int>> D(num, vector<int>(num,NON));
vector<vector<int>> P(num, vector<int>(num,0));
vector<vector<int>> makeD() {
	D = W;
	for (int k = 0; k < num; k++) {
		for (int i = 0; i < num; i++) {
			for (int j = 0; j < num; j++) {
				if (D[i][k] + D[k][j] < D[i][j])
					D[i][j] = D[i][k] + D[k][j];
			}
		}
	}
	return D;
}
vector<vector<int>> makeP() {
	
	D = W;
	for (int k = 0; k < num; k++) {
		for (int i = 0; i < num; i++) {
			for (int j = 0; j < num; j++) {
				if (D[i][k] + D[k][j] < D[i][j]) {
					D[i][j] = D[i][k] + D[k][j];
					P[i][j] = k + 1;
				}
			}
		}
	}
	return P;
}
void floyd() {
	vector<vector<int>> d = makeD();
	vector<vector<int>> p = makeP();
	cout << "<D>" << endl;
	for (int i = 0; i < num; i++) {
		for (int j = 0; j < num; j++)
			cout << d[i][j] << ' ';
		cout << endl;
	}
	cout << "<P>" << endl;
	for (int i = 0; i < num; i++) {
		for (int j = 0; j < num; j++)
			cout << p[i][j] << ' ';
		cout << endl;
	}
}
void path(int q, int r) {
	vector<vector<int>> p = makeP();
	int a = q - 1;
	int b = r - 1;

	if (p[a][b] != 0) {
		path(a+1, p[a][b] );
		cout << " v" << p[a][b];
		path(p[a][b] , b+1);
	}
	else
		return;
}
int main() {
	floyd();
	cout << "<path>" << endl;
	path(2, 4);
	return 0;
}

노드에서 시작하는 것은 시간 부족으로 하지 못했구,, 다음에 시간 나면 해봐야겠다

profile
소프트웨어 전공생 백엔드 개발자 도전기

0개의 댓글

관련 채용 정보