Junior-Developer
Home
  • Category (316)
    • 문제풀이 (270)
      • 백준oj (201)
      • 프로그래머스 (53)
      • 명품 자바 프로그래밍(개정4판) (11)
      • 구름 (5)
    • 알고리즘 (6)
    • Node.js (2)
    • 체크리스트 (37)
블로그 내 검색
Home

Junior-Developer

1일 1커밋! 1일 1 백준!

  • 문제풀이/백준oj

    [백준OJ] 4803번 트리

    2021. 9. 9.

    by. Hyeon-Uk

    반응형

    https://www.acmicpc.net/problem/4803

     

    4803번: 트리

    입력으로 주어진 그래프에 트리가 없다면 "No trees."를, 한 개라면 "There is one tree."를, T개(T > 1)라면 "A forest of T trees."를 테스트 케이스 번호와 함께 출력한다.

    www.acmicpc.net


     

    풀이

    먼저 그래프를 입력받은뒤, 각 정점마다 bfs를 이용하여 트리를 검사한다. 한 정점에서 연결된 모든 정점들이 사이클이 없다면, tree를 1 증가시키고, 사이클이 존재한다면 tree를 존재하지 않는다. 이 bfs를 이용할때, 이전에 검색했던 정점들의 흔적을 남겨놓고, 다음번에 다시한번 검사하는 일이 없도록 코드를 짜면된다.

     

    시간복잡도

    테스트케이스를 T, 각 테스트케이스 마다 정점을 N, 간선을 M이라고 한다면, O(T(N+M))이 된다.

     

    코드

    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<string>
    using namespace std;
    
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(0); cout.tie(0);
    	
    	int n, m;
    	int c = 1;
    	while (true) {
    		cin >> n >> m;
    		if (n == 0 && m == 0) {
    			break;
    		}
    		vector<int> maze[501];
    		bool visited[501] = { 0 };
    		int tree = 0;
    		for (int i = 0; i < m; i++) {
    			int u, v;
    			cin >> u >> v;
    			maze[u].push_back(v);
    			maze[v].push_back(u);
    		}
    
    		for (int i = 1; i <= n; i++) {
    			if (!visited[i]) {
    				visited[i] = true;
    				queue<pair<int,int>> q;
    				q.push({ i,-1 });
    				bool cycle = false;
    				while (!q.empty()) {
    					int now = q.front().first;
    					int parent = q.front().second;
    					q.pop();
    
    					for (int next : maze[now]) {
    						if (next!=parent) {
    							if (visited[next]) {
    								cycle = true;
    								break;
    							}
    							else {
    								q.push({ next,now });
    							}
    						}
    					}
    					if (cycle) break;
    				}
    				if(!cycle) tree++;
    			}
    		}
    
    		string answer = "";
    		if (!tree) {
    			answer = "No trees.\n";
    		}
    		else if (tree == 1) {
    			answer = "There is one tree.\n";
    		}
    		else {
    			answer = "A forest of " + to_string(tree) + " trees.\n";
    		}
    		cout << "Case " << c++ << ": " << answer;
    	}
    
    	return 0;
    }
    반응형
    저작자표시

    '문제풀이 > 백준oj' 카테고리의 다른 글

    [백준OJ] 9370번 미확인 도착지  (0) 2021.09.11
    [백준OJ] 10799번 쇠막대기  (0) 2021.09.10
    [백준OJ] 2015번 수들의 합 4  (0) 2021.09.07
    [백준OJ] 19942번 다이어트  (0) 2021.09.06
    [백준OJ] 6209번 제자리 멀리뛰기  (0) 2021.09.03

    댓글

    관련글

    • [백준OJ] 9370번 미확인 도착지 2021.09.11
    • [백준OJ] 10799번 쇠막대기 2021.09.10
    • [백준OJ] 2015번 수들의 합 4 2021.09.07
    • [백준OJ] 19942번 다이어트 2021.09.06
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
Hyeon-Uk

티스토리툴바