diff --git a/06_mst/shin/1197.cpp b/06_mst/shin/1197.cpp new file mode 100644 index 0000000..336f42e --- /dev/null +++ b/06_mst/shin/1197.cpp @@ -0,0 +1,70 @@ +#include +#include +#include +#include + +using namespace std; + +int v, e; +vector> edges; // (가중치, 정점1, 정점2) +vector> tree; // mst +int parent[10001]; + +int find_root(int x) { + if (parent[x] == x) + return x; + return parent[x] = find_root(parent[x]); // 경로 압축 +} + +void union_root(int v1, int v2) { // 서로 다른 두 집합 연결 + v1 = find_root(v1); + v2 = find_root(v2); + + if (v1 != v2) + parent[v2] = v1; // 두 집합 연결(union) +} + +int main() { + ios::sync_with_stdio(false); + cin.tie(NULL); + cout.tie(NULL); + + cin >> v >> e; + + int a, b, c; + for (int i = 0; i < e; i++) { + cin >> a >> b >> c; + edges.push_back({ c,a,b }); + } + sort(edges.begin(), edges.end()); + + for (int i = 1; i <= v; i++) { + parent[i] = i; + } + + for (int i = 0; i < e; i++) { + // 간선 뽑아내기 + auto [w, v1, v2] = edges[i]; + + // 사이클이 존재하는지 확인 + if (find_root(v1) == find_root(v2)) continue; + + // 사이클이 발생하지 않으면, mst에 현재 간선을 추가 + tree.push_back(edges[i]); + + // Parent 관계 갱신 + union_root(v1, v2); + + // 만약 정점 개수 v에 대해 v-1개의 간선을 찾았다면 종료 + if (tree.size() == v - 1) break; + } + + int ans = 0; + for (int i = 0; i < tree.size(); i++) { + int w = get<0>(tree[i]); + ans += w; + } + cout << ans; + + return 0; +} \ No newline at end of file diff --git a/06_mst/shin/16398.java b/06_mst/shin/16398.java new file mode 100644 index 0000000..e6efa01 --- /dev/null +++ b/06_mst/shin/16398.java @@ -0,0 +1,90 @@ +import java.io.*; +import java.util.*; + +public class BJ16398 { + static int n; + static int[][] map; + static StringTokenizer st; + static int[] parent; + + static class Edge{ + int v1, v2, w; + + Edge(int v1, int v2, int w){ + this.v1 = v1; + this.v2 =v2; + this.w = w; + } + +// public int compareTo(Edge e) { +// } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + n = Integer.parseInt(br.readLine()); + + map = new int[n+1][n+1]; + for(int i=0 ; i edges = new ArrayList<>(); + for(int i=0 ; i a.w - b.w); + + List tree = new ArrayList<>(); + + for(int i=0 ; i edges; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int n = Integer.parseInt(st.nextToken()); + int m = Integer.parseInt(st.nextToken()); + + edges = new ArrayList<>(); + for(int i=0 ; ia.w - b.w); + + parent = new int[n+1]; + for (int i = 1; i <= n; i++) { + parent[i] = i; + } + + long total = 0; + int maxW = 0; + for(int i=0 ; i +#include +#include + +using namespace std; +int n; + +char map[101][101]; +bool isVisited[101][101]; +bool isVisited2[101][101]; +int cnt, cnt2; // cnt : 적록색약이 아닌 사람이 봤을때의 구역의 개수 ,cnt2 : // 적록색약인 사람이 봤을때의 구역의 개수 +int dx[4] = { -1,1,0,0 }; +int dy[4] = { 0,0,-1,1 }; + +// 적록색약이 아닌 사람이 봤을때의 구역 파악하기 +void bfs(int x, int y) { + isVisited[x][y] = true; + queue> q; + q.push({ x,y }); + char color = map[x][y]; + while (!q.empty()) { + int topx = q.front().first; + int topy = q.front().second; + q.pop(); + for (int i = 0; i < 4; i++) { + int nx = topx + dx[i]; + int ny = topy + dy[i]; + if (nx < 0 || nx >= n || ny < 0 || ny >= n) + continue; + if (!isVisited[nx][ny] && map[nx][ny] == color) { + q.push({ nx,ny }); + isVisited[nx][ny] = true; + } + } + } +} +// 적록색약인 사람이 봤을때의 구역 파악하기 +void bfs2(int x, int y) { + isVisited2[x][y] = true; + queue> q; + q.push({ x,y }); + char color = map[x][y]; + while (!q.empty()) { + int topx = q.front().first; + int topy = q.front().second; + q.pop(); + for (int i = 0; i < 4; i++) { + int nx = topx + dx[i]; + int ny = topy + dy[i]; + if (nx < 0 || nx >= n || ny < 0 || ny >= n) + continue; + if (!isVisited2[nx][ny] && (map[nx][ny] == color || + map[nx][ny] == 'R' && color == 'G' || map[nx][ny] == 'G' && color == 'R')) { + q.push({ nx,ny }); + isVisited2[nx][ny] = true; + } + } + } +} + +int main() +{ + ios_base::sync_with_stdio(false); + cin.tie(NULL); + cout.tie(NULL); + + cin >> n; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + cin >> map[i][j]; + } + } + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (!isVisited[i][j]) { + bfs(i, j); + cnt++; + } + if (!isVisited2[i][j]) { + bfs2(i, j); + cnt2++; + } + } + } + + cout <[] graph; // 각 배열 원소는 ArrayList + static int[] ans; + static StringBuilder sb = new StringBuilder(); + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + n = Integer.parseInt(st.nextToken()); + m = Integer.parseInt(st.nextToken()); + + init(); + + for(int i=0 ; i(); + } + } + + // 이미 방문한 노드라도 더 짧은 경로로 도달했다면 갱신해야함!!! + static void calcDist(int x) { + Queue q = new ArrayDeque<>(); + q.offer(new int[] {x,0}); + Arrays.fill(ans, Integer.MAX_VALUE); + + while(!q.isEmpty()) { + int[] cur = q.poll(); + int curX = cur[0]; + int cnt = cur[1]; + + for(int newX : graph[curX]) { + if(ans[newX] > cnt + 1) { + ans[newX] = cnt + 1; + q.offer(new int[]{newX, cnt + 1}); + } + } + + } + + } + + static void printAns() { + ans[1] = 0; + for(int i=1 ; i<=n ; i++) { + sb.append(ans[i] == Integer.MAX_VALUE ? -1 : ans[i]).append(" "); + } + sb.append("\n"); + } +} diff --git a/07_graph/shin/7562.cpp b/07_graph/shin/7562.cpp new file mode 100644 index 0000000..5a0a31a --- /dev/null +++ b/07_graph/shin/7562.cpp @@ -0,0 +1,68 @@ +#include +#include +#include +#include + + +using namespace std; + +struct pos { + int x, y; + int cnt; +}; + +int t, l, cX, cY, gX, gY; +bool visited[301][301]; +int dx[8] = { -1,-2,-2,-1,1,2,2,1 }; +int dy[8] = { -2,-1,1,2,-2,-1,1,2 }; + +int bfs(int cX, int cY) { + int min_move = INT_MAX; + queue q; + q.push({ cX,cY,0 }); + visited[cX][cY] = true; + + while (!q.empty()) { + pos p = q.front(); + q.pop(); + int cx = p.x; + int cy = p.y; + int cnt = p.cnt; + + for (int i = 0; i < 8; i++) { + int nx = cx + dx[i]; + int ny = cy + dy[i]; + + if (nx < 0 || ny < 0 || nx >= l || ny >= l || visited[nx][ny]) + continue; + if (nx == gX && ny == gY) { + min_move = min(min_move, cnt + 1); + } + else { + q.push({ nx,ny,cnt + 1 }); + visited[nx][ny] = true; + } + } + } + + + return min_move; +} + +int main() { + ios::sync_with_stdio(0); + cin.tie(0); cout.tie(0); + + cin >> t; + while (t--) { + cin >> l >> cX >> cY >> gX >> gY; + + // bool 배열 초기화 + fill(visited[0], visited[301], false); + + int result = bfs(cX, cY); + cout << (result == INT_MAX ? 0 : result) << "\n"; + } + + return 0; +} \ No newline at end of file