Data_Structure/作業/unit12/bfs/bfs_up_triangle.cpp

243 lines
5.8 KiB
C++
Raw Normal View History

2025-01-20 21:30:53 +08:00
/* <20>ϧΪ<CFA7><CEAA>l<EFBFBD><6C>: <20>۾F<DBBE><46><EFBFBD>C<EFBFBD>P<EFBFBD>s<EFBFBD><73><EFBFBD>u<EFBFBD><75><EFBFBD>j<EFBFBD>M<EFBFBD>k(BFS) - <20>t<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#include <stdio.h>
#include <stdlib.h>
#include <string.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;
/*<2A>w<EFBFBD>q<EFBFBD><71><EFBFBD>C<EFBFBD><43><EFBFBD>c*/
typedef struct {
int items[MAX_V];
int front;
int rear;
} Queue;
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;
int weight_matrix[MAX_V+1][MAX_V+1]; /* <20>x<EFBFBD>s<EFBFBD>v<EFBFBD><76><EFBFBD>x<EFBFBD>} */
void build_adjlist(void);
void show_adjlist(void);
void show_weight_matrix(void);
void bfs(int);
Node *searchlast(Node *);
/*<2A><><EFBFBD>C<EFBFBD>ާ@<40><><EFBFBD><EFBFBD>*/
Queue* createQueue() {
Queue *q = (Queue*)malloc(sizeof(Queue));
q->front = -1;
q->rear = -1;
return q;
}
int isEmpty(Queue* q) {
return q->front == -1;
}
void enqueue(Queue* q, int value) {
if(q->front == -1)
q->front = 0;
q->rear++;
q->items[q->rear] = value;
}
int dequeue(Queue* q) {
int item = q->items[q->front];
if(q->front == q->rear) {
q->front = -1;
q->rear = -1;
} else {
q->front++;
}
return item;
}
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------Breadth First Search------");
bfs(1); /*<2A>ϧΤ<CFA7><CEA4>s<EFBFBD><73><EFBFBD>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;
char line[256];
int weight;
int line_count = 0;
fptr = fopen("up_1.dat", "r");
if (fptr == NULL) {
perror("up_1.dat");
exit(0);
}
while (fgets(line, sizeof(line), fptr)) {
line_count++;
}
total_vertex = line_count ;
rewind(fptr); // <20><><EFBFBD>m<EFBFBD>ɮ׫<C9AE><D7AB>Ш<EFBFBD><D0A8>}<7D>Y<EFBFBD>H<EFBFBD><48><EFBFBD><73><C5AA><EFBFBD>x<EFBFBD>}
/* <20><><EFBFBD>l<EFBFBD><6C><EFBFBD>v<EFBFBD><76><EFBFBD>x<EFBFBD>}<7D><>0 */
for(int i = 0; i <= total_vertex; i++)
for(int j = 0; j <= total_vertex; j++)
weight_matrix[i][j] = 0;
/* <20><><EFBFBD>l<EFBFBD>Ƭ۾F<DBBE><46><EFBFBD>C */
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>W<EFBFBD>T<EFBFBD><54><EFBFBD>ίx<CEAF>} */
for (vi = 1; vi <= total_vertex; vi++) {
/* Ū<><C5AA><EFBFBD>Ӧ檺<D3A6>ƭ<EFBFBD> */
for (vj = vi ; vj <= total_vertex; 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>Y<EFBFBD><59><EFBFBD>۾F<DBBE><46><EFBFBD>Y<EFBFBD>]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;
}
}
/* <20><><EFBFBD><EFBFBD><EFBFBD>U<EFBFBD>@<40><> */
fscanf(fptr, "%*[^\n]");
fscanf(fptr, "%*c");
}
fclose(fptr);
}
/* <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><><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");
}
}
/*<2A>ϧΤ<CFA7><CEA4>s<EFBFBD><73><EFBFBD>u<EFBFBD><75><EFBFBD>j<EFBFBD>M*/
void bfs(int start)
{
Queue* q = createQueue();
Node* ptr;
// <20>N<EFBFBD>_<EFBFBD>l<EFBFBD>`<60>I<EFBFBD>[<5B>J<EFBFBD><4A><EFBFBD>C
enqueue(q, start);
visited[start] = TRUE;
while(!isEmpty(q)) {
// <20>q<EFBFBD><71><EFBFBD>C<EFBFBD><43><EFBFBD>X<EFBFBD>`<60>I<EFBFBD>æL<C3A6>X
int currentVertex = dequeue(q);
printf("V%d ", currentVertex);
// <20>N<EFBFBD>Ҧ<EFBFBD><D2A6>۾F<DBBE>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD>`<60>I<EFBFBD>[<5B>J<EFBFBD><4A><EFBFBD>C<EFBFBD>A<EFBFBD>ë<EFBFBD><C3AB>`<60>I<EFBFBD>s<EFBFBD><73><EFBFBD>Ƨ<EFBFBD>
int neighbors[MAX_V];
int neighborCount = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD>Ҧ<EFBFBD><D2A6><EFBFBD><EFBFBD>X<EFBFBD>ݪ<EFBFBD><DDAA>۾F<DBBE>`<60>I
ptr = adjlist[currentVertex]->link;
while(ptr != NULL) {
if(!visited[ptr->vertex]) {
neighbors[neighborCount++] = ptr->vertex;
}
ptr = ptr->link;
}
// <20>N<EFBFBD>۾F<DBBE>`<60>I<EFBFBD><49><EFBFBD>s<EFBFBD><73><EFBFBD>Ƨ<EFBFBD>
for(int i = 0; i < neighborCount - 1; i++) {
for(int j = 0; j < neighborCount - i - 1; j++) {
if(neighbors[j] > neighbors[j + 1]) {
int temp = neighbors[j];
neighbors[j] = neighbors[j + 1];
neighbors[j + 1] = temp;
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ǥ[<5B>J<EFBFBD><4A><EFBFBD>C
for(int i = 0; i < neighborCount; i++) {
enqueue(q, neighbors[i]);
visited[neighbors[i]] = TRUE;
}
}
free(q);
}
/*<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;
}