인접 행렬 그래프 노드 가중치에 따라서 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;

    }

      

};