이산수학 c1 프로젝트 5

13
project #4 통신망에서 길 찾기 이산치수학 C1조 20083458 민영지 20093474 박구남 20093526 정준용 20093530 최고봉

Upload: pkok15

Post on 12-Jun-2015

244 views

Category:

Documents


10 download

TRANSCRIPT

Page 1: 이산수학 C1 프로젝트 5

project #4

통신망에서 길 찾기

이산치수학 C1조

20083458 민영지20093474 박구남20093526 정준용20093530 최고봉

Page 2: 이산수학 C1 프로젝트 5

순서

•조원별 업무분담

•일정 계획

•문제 파악

•알고리즘 계획

•소스구현

•문제점 파악 / 해결법 토의

•최종소스

Page 3: 이산수학 C1 프로젝트 5

민영지 최종 보고서 작성 및 프로젝트 총괄 및 자료 조사

박구남 알고리즘 구상 및 소스 구현

정준용 알고리즘 구상 및 소스 구현

최고봉 알고리즘 구상 및 소스 구현

05.14~05.16 과제에 대한 자료 조사 및 업무분담 일정 계획

05.16~05.21 프로젝트 알고리즘 구성 및 소스 구현

05.21~05.23 최종 소스 확인 및 최종보고서 작성

1)조원별 업무 분담

2)일정계획

Page 4: 이산수학 C1 프로젝트 5

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

Page 5: 이산수학 C1 프로젝트 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);

Page 6: 이산수학 C1 프로젝트 5

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++ ) {

Page 7: 이산수학 C1 프로젝트 5

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;

}

Page 8: 이산수학 C1 프로젝트 5

}

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;

}

Page 9: 이산수학 C1 프로젝트 5

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];

Page 10: 이산수학 C1 프로젝트 5

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;}

Page 11: 이산수학 C1 프로젝트 5

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("Sink\n");

elseprintf("\n");

}free(result);UnInitGraph(n);printf("\n계속하시려면 아무키나 누르세요....");getch();

}

Page 12: 이산수학 C1 프로젝트 5

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;

Page 13: 이산수학 C1 프로젝트 5

}

void UnInitGraph(int n) {int i;for( i = 0 ; i < n ; i++ )

while(DeleteNode(graph[i]->next));free(graph);graph = NULL;

}

코딩결과