2012 Dm A0 05 Pdf
Upcoming SlideShare
Loading in...5
×
 

2012 Dm A0 05 Pdf

on

  • 214 views

 

Statistics

Views

Total Views
214
Views on SlideShare
214
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

2012 Dm A0 05 Pdf 2012 Dm A0 05 Pdf Document Transcript

  • 5.통신망에서 길 찾기 과 제 수 행 일 지 A0 조 조원 20063532 조부관 20073547 홍진욱 20083438 김무경 20093447 김도형 20093489 송하윤 20093516 장진승 과제 수행기간 : 5월 14일 ~ 5월 25일 (12일) 총 9시간.주제 : Directed graph목표 : adjacent matrix가 주어졌을 때 indegree/outdegree를 출력하고 source/sink를 구별하는 프로그램을 만든다.계획.첫 주(5월 14일~19일) 알고리즘을 정리 익혀야 할 개념에 관하여 연구둘째주(5월 20~23일) 전 주에 끝내지 못한 부분을 논의 과제의 프로그램 소스를 작성 및 완성
  • 첫 주.5월 14일 월요일임무분담조장 : 장진승 자료조사 : 김무경, 김도형, 송하윤 프로그램코딩 : 조부관, 홍진욱학습할 내용directed graph화살표로 방향을 나타내는데, 그래프를 나타내는 각 모서리에 방향이 있다. 특히 가지가절점 T1에서 T2로 향하는 방향이 될 때 T1을 시작점, T2를 종점이라 하여 구별한다.방향이 있으므로 한 방향으로만 갈 수 있다. 이 때 1에서 2로 가는 간선을 <1, 2>로나타내며, 이것은 <2, 1>과 방향이 다르므로 같지 않다.precedes, antecedent선행사건.indegree, outdegree방향성 그래프에서 한 정점이 헤드로 구성된 선분의 수를 그 정점의 진입차수(indegree)라 한다.방향 그래프의 한 정점에 대해 그 정점에서 다른 정점으로 향하는 간선의 수.source, sinkindegree에서 보내는 값만 있는것 : sourceoutdegree에서 받는 값만 있는것 : sinkadjacency matrix 각 vertex들간의 연결을 행렬로 표현한 것이다. 인접 행렬 M은 n x n 정방행렬로서 n은 그래프내의 vertex수이다. 행렬의 (i,j)원소 Aij가 1이면 vertex Vi와 Vj가 인접해 있는 것이고, Aij가 0이면 Vi와 Vj는 인접하지 않은 것이다.
  • Sample graph Adjancency matrix for the sample 인접 행렬의 문제점 인접 행렬로는 n(n-1)개의 edge를 표현할 수 있다. 그러나 실제로 그래프내의 edge수는 이보다 훨씬 적기 때문에 대부분의 행렬원소는 0의 값을 가진다. 따라서 완전 그래프처럼 edge가 많은 경우를 제외하고는 상당량의 기억장소가 낭비되는 문제가 있다. 이러한 문제를 해결하기 위해 인접 리스트를 사용한다. [출처] 그래프(Graph)|작성자 사랑지기path, length그래프 G의 정점들의 순서를 경로(path)라고 하며, 경로상의 연결선의 수를 경로의길이(length)라고 한다.reachability matrix * * *E에 대한 인접 행렬이 A이고 E 에 대한 인접 행렬이 A 일 때 A 은 아래 식으로 계산되며이를 G에 대한 도달행렬이라고 한다. *= 2 3 nA A+A +A ...+Aweighted digraph간선에 비용이나 가중치가 할당된 그래프weight of a path경로의 가중치shortest path방향 그래프 G=(V,E)에서 n개의 정점이 존재하고 연결선에 가중치(weight)가 주어졌을 때시작 정점 Vi에서 종착 정점 Vj에 도달하는 여러 경로 중에서 가장 짧은 경로 즉, 가중치의합이 최소인 경로를 최단 경로(shortest path)라고 한다. 이러한 최단 경로를 구하는 문제는 Dijkstra의 알고리즘에 기초한다
  • 둘째주.5월 20일 일요일초안.#include <stdio.h>/** define struct node*/typedef struct{char node;char pair;int indegree;int outdegree;}_node;/** using function*/void _nodeSet(_node *node, char tempArr[]);void _nodeInit(_node nd[],int index);void charSet(char charArr[],char tempArr[]);/** 처음 charArr가 고정값이기 때문에 index 값도 고정으로 4를 입력해줘야* 프로그램이 돌아감.* 입력과 출력은 알아서 바꾸도록.*/int main(){/** used value*/int index;/** input data change plz*/char charArr[]={A,B,B,D,C,B,D,C,n};
  • /** temp Array*/char tempArr[2];/** input data size*/scanf("%d",&index);/** _node struct set*/_node nd[index];_node *node;node = nd;/** init Struct*/_nodeInit(nd,index);int i;for(i=0;i<index;i++){//scanf("%s",tempArr);/** degree operation.*/charSet(charArr,tempArr);_nodeSet(node,tempArr);}/** print sturct*/for(i=0;i<index;i++){printf("node = %cn",(node+i)->node);printf("pair = %cn",(node+i)->pair);printf("inde = %dn",(node+i)->indegree);printf("outd = %dnn",(node+i)->outdegree);}
  • getch();}/** 그냥 처음 노드 순서쌍 구한다음에 배열 당기는 함수.*/void charSet(char charArr[],char tempArr[]){tempArr[0] = charArr[0];tempArr[1] = charArr[1];int i;char temp;for(i=2;charArr[i] != n ; i++){charArr[i-2] = charArr[i];}}/** 노드 스트럭트 초기화.*/void _nodeInit(_node nd[],int index){int i;for(i=0;i<index;i++){(nd+i)->node = 0;(nd+i)->pair = 0;(nd+i)->indegree = 0;(nd+i)->outdegree = 0;}}/** 예로 AB 면 앞에 있는 A 구조체에 접근한다음에 outdegree 증가시켜주고* 뒤에있는 B 구조체에 접근에서 indegree 증가시켜주는 함수.*/void _nodeSet(_node *node, char tempArr[]){(node+((int)tempArr[0]-65))->node = tempArr[0];(node+((int)tempArr[0]-65))->pair = tempArr[1];(node+((int)tempArr[0]-65))->outdegree++;(node+((int)tempArr[1]-65))->indegree++;}
  • 5월 23일 수요일최종 소스.#include <stdio.h>/** define struct node*/typedef struct{ char node; char pair; int indegree; int outdegree;}_node;/** using function*/void _nodeSet(_node *node, char tempArr[]);void _nodeInit(_node nd[],int index);void charSet(char charArr[],char tempArr[]);/** node 개수만큼 숫자를 입력해줘야* 프로그램이 돌아감.*/int main(){/** used value*/ int index;/** input data change plz*/// char charArr[100]={A,B,B,D,C,B,D,C,n}; char charArr[100];//걸러낸거 들어오는곳 char Arr[100];//우선 입력 받는곳 int next=0; int j;
  • for(j=0;j<100;j++) Arr[j]=n;/** temp Array*/ char tempArr[2];/** input data size*/ scanf("%dn",&index);//node 수 입력 (ex: 4) int ct=0; gets(Arr);// 관계 입력(ex: AB, BD, CB, DC) 이런식으로 쭉 입력후 엔터(공백포함 상관 없음) for(j=0;j<100;j++)// 문자 걸러내기 부분 { if((Arr[j]>=65&&Arr[j]<=90)||Arr[j]==n) { charArr[next]=Arr[j]; next++; } }/* 안에 잘 들어있는지 확인 (마지막 쓰레기값은 상관 없음. for(j=0;j<100;j++) printf("%c",charArr[j]);*//** _node struct set*/ _node nd[index]; _node *node; node = nd; /* * init Struct */ _nodeInit(nd,index);
  • int i; for(i=0;i<index;i++){ //scanf("%s",tempArr);/** degree operation.*/ charSet(charArr,tempArr); _nodeSet(node,tempArr); }/** print sturct*/ for(i=0;i<index;i++){ printf("%-2c",(node+i)->node); printf("%-2d",(node+i)->indegree);//INDEGREE printf("%-2d",(node+i)->outdegree);//OUTDEGREE if(((node+i)->indegree)==0) printf("source"); if(((node+i)->outdegree)==0) printf("sink"); printf("nn");// printf("pair = %cnn",(node+i)->pair); } getch();}/** 그냥 처음 노드 순서쌍 구한다음에 배열 당기는 함수.*/void charSet(char charArr[],char tempArr[]){ tempArr[0] = charArr[0]; tempArr[1] = charArr[1]; int i; char temp;
  • for(i=2;charArr[i] != n ; i++){ charArr[i-2] = charArr[i]; }}/** 노드 스트럭트 초기화.*/void _nodeInit(_node nd[],int index){ int i; for(i=0;i<index;i++){ (nd+i)->node = A+i; (nd+i)->pair = 0; (nd+i)->indegree = 0; (nd+i)->outdegree = 0; }}/** 예로 AB 면 앞에 있는 A 구조체에 접근한다음에 outdegree 증가시켜주고* 뒤에있는 B 구조체에 접근에서 indegree 증가시켜주는 함수.*/void _nodeSet(_node *node, char tempArr[]){ (node+((int)tempArr[0]-65))->node = tempArr[0]; (node+((int)tempArr[0]-65))->pair = tempArr[1]; (node+((int)tempArr[0]-65))->outdegree++; (node+((int)tempArr[1]-65))->indegree++;}결과.