Your SlideShare is downloading. ×
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

이산수학 C1 프로젝트 5

227

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
227
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. project #4통신망에서 길 찾기 이산치수학 C1조 20083458 민영지 20093474 박구남 20093526 정준용 20093530 최고봉
  • 2. 순서 •조원별 업무분담 •일정 계획 •문제 파악 •알고리즘 계획 •소스구현•문제점 파악 / 해결법 토의 •최종소스
  • 3. 1)조원별 업무 분담 최종 보고서 작성 및 프로젝트 총괄민영지 및 자료 조사박구남 알고리즘 구상 및 소스 구현정준용 알고리즘 구상 및 소스 구현최고봉 알고리즘 구상 및 소스 구현2)일정계획 과제에 대한 자료 조사 및 업무분담05.14~05.16 일정 계획 프로젝트 알고리즘 구성 및 소스 구05.16~05.21 현05.21~05.23 최종 소스 확인 및 최종보고서 작성
  • 4. 3)문제파악Degree 출력-adjacent matrix가 주어졌을 때 indegree/outdegree를 출력하고source/sink를 구별하시오.-입력 4 AB, BD, CB, DC-출력 A 0 1 source B 2 1 C 1 1 D 1 1
  • 5. 4)알고리즘 계획 노드의 개수를 입력 받은 후 그 개수만큼의 빈 Node를 만든다. 입력받은 Edge의 값과 비교하여 indegree와 outdegree의값을 증가시킨다. 출력하는 부분에서 indegree의 값이 0이면Source, outdegree의 값이 0이면 Sink를 출력하고 끝낸다.5)소스 구현1차 소스 #include <stdio.h> #include <stdlib.h> typedef struct Node { char name; struct Node *next; struct Node *prev; }Node; typedef struct rst { int indgree; int outdgree; }rst; Node **graph; void InitGraph(int n); Node *AppendNode(Node *Target, Node *aNode); int DeleteNode(Node *Target); void UnInitGraph(int n);
  • 6. void main() { int n, i, j, x; char name[3]; Node *Now, temp; rst *result; temp.name = 0; temp.next = NULL; temp.prev = NULL; printf("노드의 개수를 입력해주세요.n"); scanf("%d",&n); result = (rst *)malloc(n*sizeof(rst)); for( i = 0 ; i < n ; i++ ) { result[i].indgree = 0; result[i].outdgree = 0; } InitGraph(n); printf("Edge를 입력해주세요.(예, AB, BD)n입력을 끝내시려면 0을 입력하세요.n"); while(1) { scanf("%s",name); if( name[0] == 0 ) break; for( x = 0 ; x < n ; x++ ) { Now = graph[x]; if( graph[x]->name == name[0] ) { temp.name = name[1]; AppendNode(Now,&temp); result[x].outdgree++; break; } else if( graph[x]->next == NULL ) { graph[x]->name = name[0]; temp.name = name[1]; AppendNode(Now,&temp); result[x].outdgree++; break; } } } for( i = 0, j = 0 ; ; j++ ) {
  • 7. if( j >= n ) { j = -1; i++; if( i >= n ) break; continue; } Now = graph[j]->next; while(1) { if( Now == NULL ) break; if( graph[i]->name == Now->name ) result[i].indgree++; Now = Now->next; } } for( i = 0 ; i < n ; i++ ) { printf("%c %d %d ", graph[i]->name, result[i].indgree, result[i].outdgree); if( result[i].indgree == 0 ) printf("Source"); else if( result[i].outdgree == 0 ) printf("Sink"); printf("n"); } free(result); UnInitGraph(n); printf("n계속하시려면 아무키나 누르세요...."); getch(); system("PAUSE");}void InitGraph(int n) { int i; graph = (Node **)malloc(n*sizeof(Node *)); for( i = 0 ; i < n ; i++ ) { graph[i] = (Node *)malloc(sizeof(Node)); graph[i]->next = NULL; graph[i]->prev = NULL; }
  • 8. }Node *AppendNode(Node *Target, Node *aNode) { Node *New; Node *Right; Node *tail; New = (Node *)malloc(sizeof(Node)); for(tail=Target;tail->next;tail=tail->next); *New = *aNode; Right = tail->next; New->next = Right; New->prev = tail; tail->next = New; if (Right) { Right->prev = New; } return New;}int DeleteNode(Node *Target) { Node *Left, *Right; if( Target == NULL ) return 0; Left = Target->prev; Right = Target->next; Left->next = Right; if (Right) Right->prev = Left; free(Target); return 1;}void UnInitGraph(int n) { int i; for( i = 0 ; i < n ; i++ ) while(DeleteNode(graph[i]->next)); free(graph); graph = NULL;}
  • 9. 1차 소스 문제점- 입력하여 출력할 때 Sink가 되면 제대로 출력되지 않았다. for( i = 0 ; i < n ; i++ ) { printf("%c %d %d ", graph[i]->name, result[i].indgree, result[i].outdgree); if( result[i].indgree == 0 ) printf("Source"); else if( result[i].outdgree == 0 ) printf("Sink"); printf("n"); }최종소스#include <stdio.h>#include <stdlib.h>typedef struct Node { char name; struct Node *next; struct Node *prev;}Node;typedef struct rst { int indgree; int outdgree;}rst;Node **graph;void InitGraph(int n);Node *AppendNode(Node *Target, Node *aNode);int DeleteNode(Node *Target);void UnInitGraph(int n);void main() { int n, i, j, x; char name[3];
  • 10. Node *Now, temp; rst *result; temp.name = 0; temp.next = NULL; temp.prev = NULL; printf("노드의 개수를 입력해주세요.n"); scanf("%d",&n); result = (rst *)malloc(n*sizeof(rst)); for( i = 0 ; i < n ; i++ ) { result[i].indgree = 0; result[i].outdgree = 0; } InitGraph(n); printf("Edge를 입력해주세요.(예, AB, BD)n입력을 끝내시려면 0 을입력하세요.n"); while(1) { scanf("%s",name); if( name[0] == 0 ) break; for( x = 0 ; x < n ; x++ ) { Now = graph[x]; if( graph[x]->name == name[0] ) { temp.name = name[1]; AppendNode(Now,&temp); result[x].outdgree++; break; } else if( graph[x]->next == NULL ) { graph[x]->name = name[0]; temp.name = name[1]; AppendNode(Now,&temp); result[x].outdgree++; break; } } for( x = 0 ; x < n ; x++ ) { Now = graph[x]; if( graph[x]->name == name[1] ) { break; }
  • 11. else if( graph[x]->next == NULL ) { graph[x]->name = name[1]; temp.name = 0; AppendNode(Now,&temp); break; } } } for( i = 0, j = 0 ; ; j++ ) { if( j >= n ) { j = -1; i++; if( i >= n ) break; continue; } Now = graph[j]->next; while(1) { if( Now == NULL ) break; if( graph[i]->name == Now->name ) result[i].indgree++; Now = Now->next; } } for( i = 0 ; i < n ; i++ ) { printf("%c %d %d",graph[i]->name,result[i].indgree,result[i].outdgree); if( result[i].indgree == 0 ) printf("Source "); if( result[i].outdgree == 0 ) printf("Sinkn"); else printf("n"); } free(result); UnInitGraph(n); printf("n계속하시려면 아무키나 누르세요...."); getch();}
  • 12. void InitGraph(int n) { int i; graph = (Node **)malloc(n*sizeof(Node *)); for( i = 0 ; i < n ; i++ ) { graph[i] = (Node *)malloc(sizeof(Node)); graph[i]->next = NULL; graph[i]->prev = NULL; }}Node *AppendNode(Node *Target, Node *aNode) { Node *New; Node *Right; Node *tail; New = (Node *)malloc(sizeof(Node)); for(tail=Target;tail->next;tail=tail->next); *New = *aNode; Right = tail->next; New->next = Right; New->prev = tail; tail->next = New; if (Right) { Right->prev = New; } return New;}int DeleteNode(Node *Target) { Node *Left, *Right; if( Target == NULL ) return 0; Left = Target->prev; Right = Target->next; Left->next = Right; if (Right) Right->prev = Left; free(Target); return 1;
  • 13. }void UnInitGraph(int n) { int i; for( i = 0 ; i < n ; i++ ) while(DeleteNode(graph[i]->next)); free(graph); graph = NULL;}코딩결과

×