01-27 19:15
벤치마킹
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 검색완료
- 푸르지오포레피스
- 가족소고기외식
- 사진에서 글자추출
- 홍시스무디
- 아이혼자다녀옴
- 양양솔비치 뷔페
- 커피쏟음
- 양양솔비치아침
- 주차넉넉
- 당근마켓중고차
- 영통역소고기
- 싱가폴중학교수학문제
- 고마워다음
- 종이캐리어
- 사진문자추출
- 편도수술
- 결항전문
- 양양솔비치조식
- 영통칠프로칠백식당
- 사진문자추출하기
- 커피
- 결항
- 중학교입학수학문제
- 파이썬
- 에어아시아
- 오트눈썰매장
- 양양솔비치세프스키친
- 영통외식
- DFS
Archives
- Today
- Total
너와나의 관심사
DFS 에서 떨어진 연결된 부분집합 구하기 본문
DFS 에서 ..각연결된 부분 집합을 구하는 문제가 자주 나온다
쉽게 1 부터 max 값까지 쭉 가면서 map 을 하나 더 구해서 각각의 DFS 를 구한뒤
연결된 부분집합의 갯수를 구하는 문제
https://www.acmicpc.net/problem/2468
#include <stdio.h> #include <iostream> #include <vector> #include <cmath> #include <string> #include <set> #include <queue> #include <functional> #include <algorithm> #include <memory.h> #pragma warning(disable : 4996) using namespace std; long long min_v, max_v; #define MAX(a,b) a>b ? a:b #define MIN(a,b) a>b ? b:a int dx[4] = { 1, -1, 0, 0 }; int dy[4] = { 0, 0, 1, -1 }; int input[101][101]; int map[101][101]; bool visited[101][101]; // 100x100 int check[101][101]; int N; int min_val = 99999999, max_val = 0; int ans = 0; void dbg_print(void){ //cout << "min " << min_val << endl; //cout << "max " << max_val << endl; for (int i = 0; i < N; i++){ for (int j = 0; j < N; j++){ cout << map[i][j] << " "; } cout << endl; } } void dfs(int x, int y, int n) { visited[x][y] = true; check[x][y] = 1; for (int i = 0; i<4; i++){ int nx = dx[i] + x, ny = dy[i] + y; if (nx >= 0 && nx < N && ny >= 0 && ny < N && map[nx][ny] ==1 && !visited[nx][ny]){ dfs(nx, ny, n); } } } void mem_reset(void){ memset(map, 0, sizeof(map)), memset(visited, false, sizeof(visited)); } int main() { int TC = 1; int V, E, S; int cnt; freopen("input5.txt", "r", stdin); setbuf(stdout, NULL); cin >> N; for (int i = 0; i < N; i++){ for (int j = 0; j < N; j++){ cin >> input[i][j]; min_val = min(min_val, input[i][j]); max_val = max(max_val, input[i][j]); } } for (int idx = 1; idx <= max_val; idx++){ cnt = 0; mem_reset(); for (int i = 0; i < N; i++){ for (int j = 0; j < N; j++){ if (input[i][j] >= idx) map[i][j] = 1; } } for (int i = 0; i < N; i++){ for (int j = 0; j < N; j++){ if (!visited[i][j] && map[i][j]==1){ cnt++; dfs(i, j, idx); } } } ans = max(ans, cnt); } cout << ans<
Comments