ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.