-
09. 9차시 수업알고리즘/정올1차교육(17.7.12~17.8.14) 2017. 8. 6. 18:45반응형
01.cpp - union, enum
#include <stdio.h>union a{int a;long long int b;}; //a와b의 주소값이 같다. b에 값 입력하고 a만 따올수 있음enum days{mon=7, tue, wed}; // 연달아서 들어감int main(){union a U;U.b=999999999;printf("%d\n", U.a);enum days D;printf("%d ",mon);printf("%d\n", tue);}union은 주소값이 같은 원소들을 묶어놓을때 씁니다. 코드에서 볼 수 있듯, b에 값을 집어넣었지만 a도 같은 값을 가지고 있는 것을 볼 수 있습니다.
enum은 순차적인 값을 갖는 원소들을 묶어놓을때 씁니다.
구조체에 대한 기본 설명은 http://sunrinnote.tistory.com/35 여기에 있습니다.
02.cpp - BFS 최단경로
http://sunrinnote.tistory.com/41 여기 BFS구현 있습니다.
이제 최단경로를 구해봅시다.
#include <stdio.h>#include <queue>#include <memory.h>using namespace std;int arr[1001][1001];//인접행렬int dist[1001]; //i까지의 최단경로//용어정리 : 노드 = vertex(복수형 vertices), 간선 : edge//인접행렬 : Adjacency matrix//행렬곱셈 : i에서 j까지 두번만에 갈 수 있는 경우의 수//BFS : 너비 우선 탐색int main(){memset(dist, -1, sizeof(dist));int cnt=0;queue<int> Q;int n;scanf("%d", &n);int v;scanf("%d", &v);for(int i=0; i<v; ++i){int a,b;scanf("%d %d", &a, &b);arr[a][b]=1;arr[b][a]=1;}Q.push(1);dist[1]=0;while(!Q.empty()){int p=Q.front();for(int i=1; i<=n; ++i){if(arr[p][i]){if(dist[i]==-1){dist[i]=dist[p]+1;Q.push(i);}if(dist[i] > dist[p]+1){dist[i]=dist[p]+1;Q.push(i);}}}Q.pop();}printf("%d", dist[n]);return 0;}std::queue에 대한 내용은 http://sunrinnote.tistory.com/70 여기에 있습니다.
memset(dist, -1, sizeof(dist)); 이거는 첫째 원소 배열에 두번째 원소를 세번째 원소만큼 채우는 겁니다.
BFS를 이용해서 구했습니다. 현재 있는 곳에서 원하는 곳으로의 경로가 원래 원하던 곳보다 적은 경로면 그 값으로 바꿉니다. 아 물론 처음 도달했을때는 무조건 그 값으로 채워줍니다.
코드 완성에 도움을 많이 준 상민이에게 감사의 말씀 전합니다~
03.cpp - 저울
/* https://www.acmicpc.net/problem/10159 */#include <stdio.h>#include <queue>#include <memory.h>using namespace std;int arr[101][101];//인접행렬int haspath[101][101];int know[101];int visit[101];int N, M;int main(){queue<int> Q;scanf("%d %d", &N, &M);for(int i=1; i<=M; ++i){int a,b;scanf("%d %d", &a, &b);arr[a][b]=1;//a보다 작은거들이 b.}for(int i=1; i<=N; ++i){memset(visit, 0, sizeof(visit));Q.push(i);visit[i]=1;while(!Q.empty()){int f=Q.front();Q.pop();for(int j=1; j<=N; ++j){if(visit[j]==1) continue;if(arr[f][j]==1){Q.push(j);visit[j]=1;haspath[i][j]=1;haspath[j][i]=1;}}}int cnt=0;}for(int i=1;i<=N;i++){int cnt = 0;for(int j=1;j<=N;j++)if(haspath[i][j]) cnt++;printf("%d\n",N-cnt-1);}}a번에서 b번으로 갈 수 있는 경로가 있는지 여부를 검사합니다.
코드 완성에 도움을 많이 준 상민이에게 감사의 말씀 전합니다~
반응형'알고리즘 > 정올1차교육(17.7.12~17.8.14)' 카테고리의 다른 글
11. 11차시 수업 (0) 2017.08.10 10. 10차시 수업 (0) 2017.08.07 08. 8차시 수업 (0) 2017.08.02 07. 7차시 수업 (0) 2017.07.31 06. 6차시 수업 (0) 2017.07.30