본문 바로가기

분류 전체보기

(146)
[ BOJ 백준 2150번 - Strongly Connected Component ] 해설 및 코드 https://www.acmicpc.net/problem/2150 목적 SCC를 구하자. 접근법 1. SCC를 구하는 기본 문제이며, kosaraju 알고리즘을 적용한다. 2. 아래는 tarjan 알고리즘을 적용해보았다. #include #define f(i,l,r) for(int i=l;i>v>>e; adj.assign(v+1, vector()); rev.assign(v+1, vector()); while(e--){ int a,b;cin>>a>>b; adj[a].push_back(b); rev[b].push_back(a); } f(i,1,v)if(!vis[i])dfs(i,adj,order); reverse(order.begin(),order.end()); memset(vis,false,sizeof(vi..
[ BOJ 백준 1944번 - 복제 로봇 ] 해설 및 코드 https://www.acmicpc.net/problem/1944 목적 복제된 로봇이 모든 열쇠를 찾기 위한 이동 거리의 최소값을 구하자. 접근법 1. 시작 지점과 열쇠가 있는 지점들을 정점으로 하는 그래프에서의 MST를 구하는 문제이다. 2. BFS로 정점간의 최단 거리를 구하여 이를 간선에 포함시켜 크루스칼 알고리즘을 적용하자. 3. 주의할 점 시작지점도 정점으로 포함하므로 정점의 최대값은 m의 최대값에 1을 더한 값이다. 중복 간선을 제외하여 프로그램 실행 시간을 줄이자. 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46..
[ BOJ 백준 2406번 - 안정적인 네트워크 ] 해설 및 코드 https://www.acmicpc.net/problem/2406 목적 최소 비용으로 회사의 네트워크가 안정적이 되도록 만들자. 접근법 1. MST를 구하는 문제이다. 크루스칼 알고리즘을 적용하자. 2. 모든 지사들은 1번 본사와 연결되어 있다. 고로 본사와의 연결은 배제시키자. 3. 따라서 지사들을 n-2개의 간선으로 연결하면 된다. 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 #include #define f(i,l,r) for(int i=l;im; int cnt=..
[ BOJ 백준 4386번 - 별자리 만들기 ] 해설 및 코드 https://www.acmicpc.net/problem/4386 목적 선을 하나 이을 때마다 두 별 사이의 거리만큼의 비용이 든다고 할 때, 별자리를 만드는 최소 비용을 구하시오 접근법 1. MST를 구하는 문제이며, 크루스칼 알고리즘을 적용하자. 2. 실수연산을 최소화하기 위해서 별도 작업을 할 필요가 없는(하기도 애매한) 문제이다. 편하게 실수 연산을 하자. 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include #define f(i,l,r) for(int i=l;ipos[i][0]>>pos[i][1]; int m=..
[ BOJ 백준 6497번 - 전력난 ] 해설 및 코드 https://www.acmicpc.net/problem/6497 목적 임의의 두 집 사이에 불이 켜져 있는 길이 있어야 할 때, 필요한 길만 남겨 절약할 수 있는 최대 액수를 구하자. 접근법 1. MST를 구하는 문제이며, 크루스칼 알고리즘을 적용하며 해결하자. 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 32 33 34 35 36 37 #include #define f(i,l,r) for(int i=l;in; if(!m&&!n)break; f(i,0,n)cin>>ed[i].a>>ed[i].b>>ed[i].c,ans+=ed[i].c; sort(ed,ed+n); memset(p,-1,4*m); f(i..
[ BOJ 백준 1647번 - 도시 분할 계획 ] 해설 및 코드 https://www.acmicpc.net/problem/1647 목적 마을을 두개로 분리하는데, 각 마을 안에서 임의의 두 집은 경로가 존재하여야 한다. 마을에 적어도 집이 한개는 있어야 한다. 접근법 1. MST 를 구하는 문제이다. 크루스칼 알고리즘을 적용하되, 간선을 n-2개만 만든다. 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 32 33 34 35 36 37 38 #include #define f(i,l,r) for(int i=l;im; memset(p,-1,sizeof(int)*(n+1)); f(i,0,m)cin>>ed[i].a>>ed[i].b>>ed[i].c; sort(ed,ed+m);..
[ BOJ 백준 1197번 - 최소 스패닝 트리 ] 해설 및 코드 https://www.acmicpc.net/problem/1197 목적 그래프가 주어졌을 때, 그 그래프의 최소 스패닝 트리를 구하자. 접근법 1. 크루스칼 알고리즘의 기본 응용 문제이다. 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 32 33 34 35 36 37 #include #define f(i,l,r) for(int i=l;ie; memset(p,-1,sizeof(int)*(v+1)); f(i,0,e)cin>>ed[i].a>>ed[i].b>>ed[i].c; sort(ed,ed+e); int ans=0; f(i,0,e){ int ra=find(ed[i].a),rb=find(ed[i].b); i..
[ BOJ 백준 2610번 - 회의준비 ] 해설 및 코드 https://www.acmicpc.net/problem/2610 목적 필요한 위원회의 개수와, 각 위원회에서 누가 대표로 선정돼야 하는지 구하자. 접근법 1. 알고있는 사람끼리 같은 위원회에 속해야 한다. 따라서 k는 알고있는 사람 네트워크의 개수라고 할 수 있다. 2. 각 위원회의 대표는 네트워크의 중간에 있어야 한다. (가장 먼 사람과의 거리가 최소가 되어야 하므로...) 3. 플로이드 와샬 알고리즘을 적용하여 각 노드간 최단 거리를 구하고, 각 위원회의 대표를 정해서 오름차순으로 정렬한다. 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 32 33 34 35 36 37 38 39 40 41 42 ..