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
| #include <cstdio> #include <queue> #include <cstring>
typedef std::pair<int, int> PII; std::priority_queue<PII, std::vector<PII>, std::greater<PII> > q; struct Edge { int to, nxt, w; } e[2000005]; int dis[1005], head[1005], dp[1005], tot, n, m; bool mp[1005][1005], done[1005]; inline void AddEdge(const int u, const int v, const int w) { e[++ tot].to = v, e[tot].nxt = head[u], e[tot].w = w, head[u] = tot; } void Dijkstra() { memset(dp, 0, sizeof dp); memset(dis, 0x3f, sizeof dis); memset(done, 0, sizeof done); dp[2] = 1; q.push(std::make_pair(dis[2] = 0, 2)); while (q.size()) { int u(q.top().second); q.pop(); if (done[u]) continue; done[u] = true; for (int i(head[u]); i; i = e[i].nxt) { int v(e[i].to); if (dis[u] + e[i].w < dis[v]) q.push(std::make_pair(dis[v] = dis[u] + e[i].w, v)); } } } int DP(const int u) { if (dp[u]) return dp[u]; for (int i(1); i <= n; ++ i) if (dis[i] < dis[u] && mp[i][u]) dp[u] += DP(i); return dp[u]; }
signed main() { while (true) { scanf("%d", &n); if (!n) return 0; memset(head, 0, sizeof head); memset(mp, 0, sizeof mp); tot = 0; scanf("%d", &m); for (int i(1); i <= m; ++ i) { int u, v, w; scanf("%d%d%d", &u, &v, &w); mp[u][v] = mp[v][u] = true; AddEdge(u, v, w), AddEdge(v, u, w); } Dijkstra(); printf("%d\n", DP(1)); } }
|