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

Like this? Share it with your network

Share

이산수학 C1 프로젝트 5

on

  • 414 views

 

Statistics

Views

Total Views
414
Views on SlideShare
414
Embed Views
0

Actions

Likes
0
Downloads
1
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

이산수학 C1 프로젝트 5 Document 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;}코딩결과