/
mnist.cpp
105 lines (76 loc) · 1.89 KB
/
mnist.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
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
#define _1 first
#define _2 second
#define eps 1e-8
#define sqr(x) ((x)*(x))
using namespace std;
typedef pair<double, double> point;
const int N = 1000000;
int n, m, cnt;
vector<int> e[N];
map<int, int> st;
point pos[N];
double dis[N];
priority_queue<pair<double, int>, vector<pair<double, int> >, greater<pair<double, int> > > Q;
double cal_dis(const point& a, const point& b) {
return sqrt(sqr(a._1 - b._1) + sqr(a._2 - b._2));
}
int main() {
// nds
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
int id;
double lat, lon;
scanf("%d%lf%lf", &id, &lat, &lon);
st[id] = cnt;
pos[cnt] = make_pair(lat, lon);
cnt++;
}
// egs
scanf("%d", &m);
for (int i = 0; i < m; ++i) {
int x, y;
scanf("%d%d", &x, &y);
x = st[x];
y = st[y];
e[x].push_back(y);
e[y].push_back(x);
}
for (int i = 0; i < n; ++i)
dis[i] = 1e9;
// find a relative node
int id = 0;
for (int i = 0; i < n; ++i)
if (e[i].size() > 0) {
id = i;
break;
}
dis[id] = 0;
Q.push(make_pair(0, id));
// dij with heap
for ( ; !Q.empty(); Q.pop()) {
double cdis = Q.top()._1;
int cid = Q.top()._2;
if (abs(cdis - dis[cid]) > eps)
continue;
for (int i = 0; i < e[cid].size(); ++i) {
double temp = cdis + cal_dis(pos[cid], pos[e[cid][i]]);
if (temp < dis[e[cid][i]]) {
dis[e[cid][i]] = temp;
Q.push(make_pair(temp, e[cid][i]));
}
}
}
for (int i = 0; i < n; ++i)
if (dis[i] < 1e7)
printf("%d %.5f\n", i, dis[i]);
return 0;
}