-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLab11_minLength.cpp
114 lines (100 loc) · 2.42 KB
/
Lab11_minLength.cpp
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
#include <iostream>
#include <math.h>
#define INFIN 200
using namespace std;
struct headNode
{
int x;
int y;
headNode()
{
x = y = -1;
}
};
enum state
{
VISITED = 1,
UNVISITED = 0
};
double distance(headNode node1, headNode node2)
{
/*****Distance between two points*****/
double tmp = sqrt(pow(abs(node2.x - node1.x), 2) + pow(abs(node2.y - node1.y), 2));
return tmp;
}
double dijkstra(int start, int end, int nodenum, double **nbrlist)
{
int *final = new int[nodenum];
double *dist = new double[nodenum];
int *path = new int[nodenum];
for (int i = 0; i < nodenum; i++)
{ // 3 list init
final[i] = UNVISITED;
if (!i)
dist[i] = 0.00;
else
dist[i] = INFIN;
path[i] = -1;
}
for (int i = 0; i < nodenum; i++)
{
double mindist = INFIN;
int index = 0;
for (int j = 0; j < nodenum; j++)
{ // find the minimum of dist_array
if (final[j] == UNVISITED && dist[j] < mindist)
{
mindist = dist[j];
index = j;
}
}
final[index] = VISITED;
for (int k = 0; k < nodenum; k++)
{
if (dist[index] + nbrlist[index][k] < dist[k] && nbrlist[index][k] != 0)
{
dist[k] = dist[index] + nbrlist[index][k];
path[k] = index;
}
}
}
return dist[end - 1];
}
int main()
{
int nodeNum, edgeNum;
cin >> nodeNum;
/*****node array init*****/
headNode *nodelist = new headNode[nodeNum];
for (int num = 0; num < nodeNum; num++)
{
cin >> nodelist[num].x >> nodelist[num].y;
}
/*****neighbor array init*****/
double **nbrlist;
nbrlist = new double *[nodeNum];
for (int i = 0; i < nodeNum; i++)
{
nbrlist[i] = new double[nodeNum];
}
for (int i = 0; i < nodeNum; i++)
{
for (int j = 0; j < nodeNum; j++)
nbrlist[i][j] = 0.00;
}
/*****edge array init*****/
cin >> edgeNum;
int x = -1, y = -1;
for (int i = 0; i < edgeNum; i++)
{
cin >> x >> y;
nbrlist[x - 1][y - 1] = distance(nodelist[x - 1], nodelist[y - 1]);
}
/*****show result*****/
cin >> x >> y;
double minlength = dijkstra(x, y, nodeNum, nbrlist);
printf("%.2f", minlength);
delete[] nodelist;
delete[] nbrlist;
system("pause");
}