Download - 이산수학 C1 프로젝트 5
project #4
통신망에서 길 찾기
이산치수학 C1조
20083458 민영지20093474 박구남20093526 정준용20093530 최고봉
순서
•조원별 업무분담
•일정 계획
•문제 파악
•알고리즘 계획
•소스구현
•문제점 파악 / 해결법 토의
•최종소스
민영지 최종 보고서 작성 및 프로젝트 총괄 및 자료 조사
박구남 알고리즘 구상 및 소스 구현
정준용 알고리즘 구상 및 소스 구현
최고봉 알고리즘 구상 및 소스 구현
05.14~05.16 과제에 대한 자료 조사 및 업무분담 일정 계획
05.16~05.21 프로젝트 알고리즘 구성 및 소스 구현
05.21~05.23 최종 소스 확인 및 최종보고서 작성
1)조원별 업무 분담
2)일정계획
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
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);
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++ ) {
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;
}
}
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;
}
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];
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;}
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();
}
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;
}
void UnInitGraph(int n) {int i;for( i = 0 ; i < n ; i++ )
while(DeleteNode(graph[i]->next));free(graph);graph = NULL;
}
코딩결과