-
Notifications
You must be signed in to change notification settings - Fork 0
/
BB.c
123 lines (91 loc) · 1.83 KB
/
BB.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <stdio.h>
#define N 7
void print_route(int prev[], int g)
{
int tmp;
printf("%d", g);
tmp = prev[g];
while(prev[tmp] != -1){
if(tmp >= 0){
printf(" <-%d", tmp);
tmp = prev[tmp];
}
}
printf("<-%d\n", tmp);
printf("\n");
return;
}
int distance(int prev[], int node, int tree[][3], int arc_num)
{
int tmp = node;
int d = 0;
while(prev[tmp] != -1){
d += length(tree, arc_num, prev[tmp], tmp);
tmp = prev[tmp];
}
return d;
}
int length(int tree[][3], int arc_num, int s, int t)
{
int i;
for (i = 0; i < arc_num; i++)
{
if (tree[i][0] == s && tree[i][1] == t)
{
return tree[i][2];
}
}
return -1;
}
int main(void)
{
int tree[][3] = {{0,1,1}, {0,2,5}, {1,3,1}, {3,4,1}, {2,5,1}, {4,5,4}, {5,6,1}};
int arc_num = sizeof(tree)/sizeof(tree[0]);
int open[N];
int closed[7] = {0};
int size = 0;
int start =0;
int goal = 6;
int top,i,mindex,tmp;
int prev[N] = {-1,-1,-1,-1,-1,-1,-1};
int k;
int l=0;
open[size++] = start;
while(size > 0){
//mindex = 0;
/*for (k = 1; k < size; k++)
{
if(dist[open[mindex]]> dist[open[k]]){
mindex = k;
}
}
tmp = open[mindex];
open[mindex] = open[size-1];
open[size-1] = tmp;
*/
top = open[--size];
printf("%d ", top);
if(top == goal){
printf("\nOK\n");
print_route(prev,goal);
return 0;
}
for (i = 0; i < arc_num; i++)
{
if (tree[i][0] == top)
{
if (closed[tree[i][1]] == 0)
{
open[size++] = tree[i][1];
prev[tree[i][1]] = top;
closed[tree[i][1]] = 1;
}else if(closed[tree[i][1]] == 1){
if(distance(prev, i, tree, arc_num) > distance(prev, top, tree, arc_num))
prev[tree[i][1]] = top;
}
}
}
}
printf("\nNG\n");
return 0;
}