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
| #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e3 + 50; const ll mod = (1ll << 31) - 1; ll ans = 1; int n, m, d[maxn], a[maxn][maxn]; bool v[maxn];
void dijkstra() { memset(d, 0x3f, sizeof(d)); d[1] = 0; for (int k = 1; k < n; ++k) { int x = 0; for (int i = 1; i <= n; ++i) if (!v[i] && (x == 0 || d[x] > d[i])) x = i; v[x] = 1; for (int y = 1; y <= n; ++y) d[y] = min(d[y], a[x][y] + d[x]); } }
void prim() { memset(v, 0, sizeof(v)); v[1] = 1; for (int k = 1; k <= n; ++k) { int x = 0, cnt = 0; for (int i = 1; i <= n; ++i) if (!v[i] && (x == 0 || d[x] > d[i])) x = i; for (int y = 1; y <= n; ++y) if (v[y] && d[x] == d[y] + a[x][y]) ++cnt; v[x] = 1; ans = (ans * cnt) % mod; } }
int main() { cin >> n >> m; memset(a, 0x3f, sizeof(a)); for (int x, y, z, i = 1; i <= m; i++) { cin >> x >> y >> z; a[x][y] = a[y][x] = min(a[x][y], z); } dijkstra(), prim(); cout << ans << endl; return 0; }
|