인접 행렬 그래프 노드 가중치에 따라서 bfs나 다익스트라 값 뱉어내는 코드 ㅋㅋㅋㅋ
벡터에 0이 아닌 값을 집어넣고, 이걸 다시 배열 초기화에 넣고 돌려서, 배열 값이 0 이상인 수가 하나 이상일 때 다익스트라, 하나일 때 BFS 뱉어내는 코드 싸질러봄
class searchSystem : public adjGraph
{
public:
bool visited[MAX_NODE];
int dist[MAX_NODE];
vector<int> vec;
void resetVisited() //
{
for (int i = 0; i < MAX_NODE; i++)
{
visited[i] = false;
}
}
void search() // 2. 벡터에 저장된 그래프를 이루는 수를 탐색하고 0아니면 저장
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (adjNode[i][j] != 0)
{
vec.push_back(adjNode[i][j]);
}
}
}
}
bool containsOnlyOneNumber() // 3.
{
int inDebate[MAX_NODE] = {0};
for (int i = 0; i < vec.size(); ++i) {
int num = vec[i];
inDebate[num]++;
}
int Count = 0;
for (int i = 0; i < MAX_NODE; ++i) {
if (inDebate[i] > 0) {
Count++;
}
}
return Count == 1;
}
void operateSearch() // 1. 처음 검사 실행 함수
{
search();
if (containsOnlyOneNumber()) //4 실행
{
bfs(0);
}
else
{
diskstra(0);
}
}
void resetDist() //다익스트라 0을 무한 노드로 변경
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (adjNode[i][j] == 0)
{
adjNode[i][j] = INF;
}
}
}
}
void printDist() // 다익스트라
{
cout << "nodeNm :" << ' ';
for (int i = 0; i < size; i++)
{
cout << getNode(i) << ' ';
}
cout << "\n";
cout << "result :";
for (int i = 0; i < size; i++)
{
cout << dist[i] << ' ';
}
cout << endl;
}
void diskstra(int start)
{
resetVisited();
resetDist();
for (int i = 0; i < size; ++i)
{
dist[i] = adjNode[start][i];
}
dist[start] = 0;
visited[start] = true;
for (int i = 0; i < size - 2; ++i)
{
int min_node = getSmallIndex();
visited[min_node] = true;
for (int j = 0; j < size; ++j)
{
if (!visited[j] && adjNode[min_node][j] != 0 &&
dist[min_node] + adjNode[min_node][j] < dist[j])
{
dist[j] = dist[min_node] + adjNode[min_node][j];
}
}
}
printDist();
}
int getSmallIndex() // 다익스트라
{
int min = INF;
int minpos = 0;
for (int i = 0; i < size; i++)
{
if (dist[i] < min && !visited[i])
{
min = dist[i];
minpos = i;
}
}
return minpos;
}
void bfs(int start)
{
queue<int> q;
visited[start] = true;
q.push(start);
cout << "bfs operate :" << ' ';
while (!q.empty())
{
int number = q.front();
q.pop();
cout << getNode(number) << ' ';
for (int i = 0; i < size; i++)
{
if (adjNode[number][i] != 0 && !visited[i])
{
visited[i] = true;
q.push(i);
}
}
}
cout << endl;
}
};
훌륭하네요 읽지는 않았읍니다 - dc App