179 lines
4.2 KiB
C++
179 lines
4.2 KiB
C++
|
/* file name: dfs.c */
|
|||
|
/* <20>ϧΪ<CFA7><CEAA>l<EFBFBD><6C>: <20>۾F<DBBE><46><EFBFBD>C<EFBFBD>P<EFBFBD>ܦV<DCA6>u<EFBFBD><75><EFBFBD>j<EFBFBD>M<EFBFBD>k(DFS)*/
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
|
|||
|
#define MAX_V 100 /*<2A>̤j<CCA4>`<60>I<EFBFBD><49>*/
|
|||
|
#define TRUE 1
|
|||
|
#define FALSE 0
|
|||
|
|
|||
|
/*<2A>w<EFBFBD>q<EFBFBD><71><EFBFBD>Ƶ<EFBFBD><C6B5>c*/
|
|||
|
typedef struct node_tag {
|
|||
|
int vertex;
|
|||
|
struct node_tag *link;
|
|||
|
} Node;
|
|||
|
|
|||
|
Node *adjlist[MAX_V+1]; /*<2A>ŧi<C5A7>۾F<DBBE><46><EFBFBD>C*/
|
|||
|
int visited[MAX_V+1]; /*<2A>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>O<EFBFBD>_<EFBFBD>w<EFBFBD><77><EFBFBD>X*/
|
|||
|
int total_vertex;
|
|||
|
|
|||
|
|
|||
|
void build_adjlist(void);
|
|||
|
void show_adjlist(void);
|
|||
|
void show_weight_matrix(void);
|
|||
|
void dfs(int);
|
|||
|
Node *searchlast(Node *);
|
|||
|
int weight_matrix[MAX_V+1][MAX_V+1]; /* <20>x<EFBFBD>s<EFBFBD>v<EFBFBD><76><EFBFBD>x<EFBFBD>} */
|
|||
|
|
|||
|
int main()
|
|||
|
{
|
|||
|
build_adjlist(); /*<2A>H<EFBFBD>۾F<DBBE><46><EFBFBD>C<EFBFBD><43><EFBFBD>ܹϧ<DCB9>*/
|
|||
|
show_weight_matrix(); /*<2A><><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD><76><EFBFBD>x<EFBFBD>}*/
|
|||
|
show_adjlist(); /*<2A><><EFBFBD>ܦ<EFBFBD><DCA6>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|||
|
puts("\n------Depth Fisrt Search------");
|
|||
|
dfs(1); /*<2A>ϧΤ<CFA7><CEA4>ܦV<DCA6>u<EFBFBD><75><EFBFBD>j<EFBFBD>M<EFBFBD>A<EFBFBD>H<EFBFBD><48><EFBFBD>I1<49><31><EFBFBD>ҩl<D2A9><6C><EFBFBD>I*/
|
|||
|
printf("\n");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
void build_adjlist()
|
|||
|
{
|
|||
|
FILE *fptr;
|
|||
|
Node *node, *lastnode;
|
|||
|
int vi, vj, weight;
|
|||
|
char line[256];
|
|||
|
int line_count = 0;
|
|||
|
|
|||
|
fptr = fopen("down_1.dat", "r");
|
|||
|
if (fptr == NULL) {
|
|||
|
perror("down_1.dat");
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
|
|||
|
// <20>p<EFBFBD><70><EFBFBD>`<60><><EFBFBD>I<EFBFBD><49>
|
|||
|
while (fgets(line, sizeof(line), fptr)) {
|
|||
|
line_count++;
|
|||
|
}
|
|||
|
total_vertex = line_count; // <20>`<60><><EFBFBD>I<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
rewind(fptr);
|
|||
|
|
|||
|
// <20><><EFBFBD>l<EFBFBD>ư}<7D>C<EFBFBD>ΦU<CEA6><55><EFBFBD>C<EFBFBD>ҩl<D2A9><6C>
|
|||
|
for (vi = 1; vi <= total_vertex; vi++) {
|
|||
|
visited[vi] = FALSE;
|
|||
|
adjlist[vi] = (Node *)malloc(sizeof(Node));
|
|||
|
adjlist[vi]->vertex = vi;
|
|||
|
adjlist[vi]->link = NULL;
|
|||
|
}
|
|||
|
|
|||
|
// Ū<><C5AA><EFBFBD>U<EFBFBD>T<EFBFBD><54><EFBFBD>x<EFBFBD>}
|
|||
|
for (vi = 1; vi <= total_vertex; vi++) {
|
|||
|
// <20>uŪ<75><C5AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>vi<76>Ӥ<EFBFBD><D3A4><EFBFBD><EFBFBD>]<5D>U<EFBFBD>T<EFBFBD><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^
|
|||
|
for (vj = 1; vj < vi; vj++) {
|
|||
|
if (fscanf(fptr, "%d", &weight) != 1) {
|
|||
|
printf("Error reading weight at vi=%d, vj=%d\n", vi, vj);
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
// <20>x<EFBFBD>s<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>}
|
|||
|
weight_matrix[vi][vj] = weight;
|
|||
|
weight_matrix[vj][vi] = weight; // <20>]<5D><><EFBFBD>O<EFBFBD>L<EFBFBD>V<EFBFBD>ϡA<CFA1>ҥH<D2A5><48><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>s
|
|||
|
|
|||
|
// <20>p<EFBFBD>G<EFBFBD>۾F<DBBE>]weight = 1<>^<5E>A<EFBFBD>h<EFBFBD>إ߳s<DFB3><73>
|
|||
|
if (weight == 1) {
|
|||
|
// <20>[<5B>J vi -> vj <20><><EFBFBD>s<EFBFBD><73>
|
|||
|
node = (Node *)malloc(sizeof(Node));
|
|||
|
node->vertex = vj;
|
|||
|
node->link = NULL;
|
|||
|
lastnode = searchlast(adjlist[vi]);
|
|||
|
lastnode->link = node;
|
|||
|
|
|||
|
// <20>[<5B>J vj -> vi <20><><EFBFBD>s<EFBFBD><73><EFBFBD>]<5D>]<5D><><EFBFBD>O<EFBFBD>L<EFBFBD>V<EFBFBD>ϡ^
|
|||
|
node = (Node *)malloc(sizeof(Node));
|
|||
|
node->vertex = vi;
|
|||
|
node->link = NULL;
|
|||
|
lastnode = searchlast(adjlist[vj]);
|
|||
|
lastnode->link = node;
|
|||
|
}
|
|||
|
}
|
|||
|
// Ū<><C5AA><EFBFBD>﨤<EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>]<5D>@<40>w<EFBFBD>O0<4F>^
|
|||
|
fscanf(fptr, "%d", &weight);
|
|||
|
}
|
|||
|
|
|||
|
fclose(fptr);
|
|||
|
}
|
|||
|
|
|||
|
/*<2A><><EFBFBD>ܦU<DCA6>۾F<DBBE><46><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|||
|
void show_adjlist()
|
|||
|
{
|
|||
|
int index;
|
|||
|
Node *ptr;
|
|||
|
|
|||
|
puts("Head adjacency nodes");
|
|||
|
puts("------------------------------");
|
|||
|
for (index = 1; index <= total_vertex; index++) {
|
|||
|
printf("V%-2d ",adjlist[index]->vertex);
|
|||
|
ptr = adjlist[index]->link;
|
|||
|
while (ptr != NULL) {
|
|||
|
printf("--> V%d ",ptr->vertex);
|
|||
|
ptr = ptr->link;
|
|||
|
}
|
|||
|
printf("\n");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* <20>ק<EFBFBD><D7A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD><76><EFBFBD>x<EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD>ơA<C6A1>Ϩ<EFBFBD><CFA8><EFBFBD><EFBFBD>M<EFBFBD><4D> */
|
|||
|
void show_weight_matrix()
|
|||
|
{
|
|||
|
int i, j;
|
|||
|
printf("\n=== Weight Matrix ===\n");
|
|||
|
printf(" ");
|
|||
|
for(j = 1; j <= total_vertex; j++) {
|
|||
|
printf("V%-3d", j);
|
|||
|
}
|
|||
|
printf("\n");
|
|||
|
|
|||
|
for(i = 1; i <= total_vertex; i++) {
|
|||
|
printf("V%-3d", i);
|
|||
|
for(j = 1; j <= total_vertex; j++) {
|
|||
|
printf("%-4d", weight_matrix[i][j]);
|
|||
|
}
|
|||
|
printf("\n");
|
|||
|
}
|
|||
|
printf("\n");
|
|||
|
}
|
|||
|
|
|||
|
/*<2A>ϧΤ<CFA7><CEA4>ܦV<DCA6>u<EFBFBD><75><EFBFBD>j<EFBFBD>M*/
|
|||
|
void dfs(int v)
|
|||
|
{
|
|||
|
Node *ptr;
|
|||
|
int w;
|
|||
|
|
|||
|
printf("V%d ",adjlist[v]->vertex);
|
|||
|
visited[v] = TRUE; /*<2A>]<5D>wv<77><76><EFBFBD>I<EFBFBD><49><EFBFBD>w<EFBFBD><77><EFBFBD>X<EFBFBD>L*/
|
|||
|
ptr = adjlist[v]->link; /*<2A><><EFBFBD>X<EFBFBD>۾F<DBBE><46><EFBFBD>I*/
|
|||
|
|
|||
|
do {
|
|||
|
/* <20>Y<EFBFBD><59><EFBFBD>I<EFBFBD>|<7C><><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>A<EFBFBD>h<EFBFBD>H<EFBFBD><48><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD><49><EFBFBD>s<EFBFBD>ҩl<D2A9>I<EFBFBD>~<7E><>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ܦV<EFBFBD>u<EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>M<EFBFBD>k<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>A<EFBFBD>_<EFBFBD>h<EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><EFBFBD><EFBFBD>۾F<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҧ<EFBFBD><EFBFBD>۳s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<EFBFBD>I<EFBFBD><EFBFBD><EFBFBD>w<EFBFBD><EFBFBD><EFBFBD>X */
|
|||
|
w = ptr->vertex;
|
|||
|
if (!visited[w])
|
|||
|
dfs(w);
|
|||
|
else
|
|||
|
ptr = ptr->link;
|
|||
|
} while (ptr != NULL);
|
|||
|
}
|
|||
|
|
|||
|
/*<2A>j<EFBFBD>M<EFBFBD><4D><EFBFBD>C<EFBFBD>̫<EFBFBD><CCAB>`<60>I<EFBFBD><49><EFBFBD><EFBFBD>*/
|
|||
|
Node *searchlast( Node *linklist )
|
|||
|
{
|
|||
|
Node *ptr;
|
|||
|
|
|||
|
ptr = linklist;
|
|||
|
while (ptr->link != NULL)
|
|||
|
ptr = ptr->link;
|
|||
|
return ptr;
|
|||
|
}
|
|||
|
|