@@ -6,48 +6,35 @@ using ll = long long;
6
6
const int inf = 1e7 ;
7
7
int N, M;
8
8
vector<vector<int >> G;
9
- vector<vector<int >> P;
10
- vector<vector<bool >> U;
11
-
12
- void fill (int i, int j) {
13
- if (P[i][j] == N) {
14
- U[j][j] = U[i][j] = true ;
15
- return ;
16
- }
17
- int k = P[i][j];
18
- fill (i, k);
19
- fill (k, j);
20
- }
9
+ vector<vector<int >> O;
21
10
22
11
int solve () {
23
- P. assign (N, vector< int >(N, N));
24
- U. assign (N, vector< bool >(N, false )) ;
12
+ // COPY
13
+ O = G ;
25
14
26
15
for (int k = 0 ; k < N; ++k) {
27
16
for (int i = 0 ; i < N; ++i) {
28
17
for (int j = 0 ; j < N; ++j) {
29
18
if (G[i][k] == inf || G[k][j] == inf) continue ;
30
19
if (G[i][k] + G[k][j] < G[i][j]) {
31
20
G[i][j] = G[i][k] + G[k][j];
32
- P[i][j] = k;
33
21
}
34
22
}
35
23
}
36
24
}
37
25
26
+ int ans = 0 ;
38
27
for (int i = 0 ; i < N; ++i) {
39
- for (int j = 0 ; j < N; ++j) {
40
- fill (i, j);
41
- }
42
- }
43
-
44
- int e = 0 ;
45
- for (int i = 0 ; i < N; ++i) {
46
- for (int j = 0 ; j < N; ++j) {
47
- if (i != j && U[i][j]) ++e;
28
+ for (int j = i + 1 ; j < N; ++j) {
29
+ if (i == j || O[i][j] == inf) continue ;
30
+ bool use = false ;
31
+ for (int s = 0 ; s < N; ++s) {
32
+ if (G[s][i] + O[i][j] == G[s][j]) use = true ;
33
+ }
34
+ if (!use) ++ans;
48
35
}
49
36
}
50
- return M - (e / 2 ) ;
37
+ return ans ;
51
38
}
52
39
53
40
int main () {
@@ -56,6 +43,7 @@ int main() {
56
43
57
44
cin >> N >> M;
58
45
G.assign (N, vector<int >(N, inf));
46
+ for (int i = 0 ; i < N; ++i) G[i][i] = 0 ;
59
47
for (int i = 0 ; i < M; ++i) {
60
48
int a, b, c;
61
49
cin >> a >> b >> c;
0 commit comments