GALLERY문제 질문드립니다.

  • khycan
    khycan
    #include <iostream>
    
    #define MAX_VERTEX 1000
    
    class Graph
    {
    private:
        int n;
        int graph[MAX_VERTEX][MAX_VERTEX];
        int queue[MAX_VERTEX], visitors[MAX_VERTEX];
    
    public:
        void onVisitors(int i) {
            visitors[i] = 1;
        }
    
        int visit_yet() {
            for(int i = 0; i<n; i++) {
                if(!visitors[i])
                    return 0;
            }
    
            return 1;
        }
    
        int BFS(int v) {
            int front = 0, rear = 0;
            int noc = 0;
            bool noc_f;
    
            visitors[v] = 1;
            queue[rear++] = v;
            while(front < rear) {
    
                v = queue[front++];
                noc_f = false;
                for(int i = 0; i<n; i++) {
    
                    if(graph[v][i] == 1 && !visitors[i]) {
                        visitors[i] = 1;
                        queue[rear++] = i;
    
                        noc_f = true;
                    }
                }
    
                if(noc_f) noc++;
            }
    
            return noc;
        }
    
    
        void initGraph(int N) {
            n = N;
    
            for(int i=0; i<n; i++) {
    
                visitors[i] = 0;
    
                for(int j=0; j<n; j++) {
                        graph[i][j] = 0;
                }
            }
        }
    
        int EdgeSum(int iter) {
            int sum = 0;
    
            for(int i=0; i<n; i++) {
                sum += graph[iter][i];
            }
    
            return sum;
        }
    
        void insertEdge(int start, int end) {
            graph[start][end] = 1;
            graph[end][start] = 1;
        }
    
        int findBiggestEdgeSum() {
            int bigSum = 0;
            int c_bigSum = 0;
            int manyConnectedVertex = 0;
    
            for(int i=0; i<n; i++) {
                if(visitors[i])
                    continue;
                c_bigSum = EdgeSum(i);
    
                if(bigSum < c_bigSum) {
                    bigSum = c_bigSum;
                    manyConnectedVertex = i;
                }
            }
    
            if(bigSum != 0)
                return manyConnectedVertex;
    
            return -1;
        }
    
    };
    
    int main() {
        int T;
        int g, h;
        int s, e;
        int be;
        int noc=0;
        int k;
    
        Graph gr;
    
        std::cin >> T;
    
        while(T > 0) {
            std::cin >> g >> h;
    
            gr.initGraph(g);
    
            for(k=0; k<h; k++) {
                std::cin >> s >> e;
    
                gr.insertEdge(s, e);
            }
    
            // 고립상태 방 조사 및 카메라 추가
            for(k=0; k<g; k++) {
                if(gr.EdgeSum(k) == 0) {
                    gr.onVisitors(k);
                    noc++;
                }
            }
    
    
            while(gr.visit_yet() == 0) {
                be = gr.findBiggestEdgeSum();
    
                if(be >= 0) {
                    noc += gr.BFS(be);
                }
            }
    
            std::cout << noc << "\n";
            noc = 0;
            T--;
        }
    
        return 0;
    }
    

    매 케이스마다 방 수를 입력받고 그래프와 방문여부를 조사하는
    배열을 초기화합니다.

    복도를 입력받는대로 그래프에 추가합니다.

    그래프의 한 행의 합이 0인 행 즉 복도가 없는 방을 먼저 조사하여
    방문여부배열에 방문을 표시하고 카메라수(noc 변수)를 증가시킵니다.

    아직 방문하지 않은 곳이 있을경우 행의 합이 가장 큰 곳을 찾고 거기서 부터 너비 우선 탐색을 진행하며 카메라를 반환합니다.

    분명 대부분의 입력에 올바른 답을 반환하는데 문제가 뭔지 감이 안잡힙니다.


    8년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.