intDijkstra(){ memset(dis, 0x3f, sizeof dis); Q.push(std::make_pair(dis[n] = 0, n)); while (Q.size()) { int u = Q.top().second; Q.pop(); if (done[u]) continue; if (!u) return dis[u]; 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)); } } }
intmain(){ scanf("%d", &n); for (int i = 0; i < n; ++ i) for (intj(0); j <= 9; ++ j) AddEdge(i, (i * 10 + j) % n, j); for (inti(1); i <= 9; ++ i) AddEdge(n, i % n, i); printf("%d", Dijkstra()); return0; }
#include<cstdio> #include<queue> #include<cstring> #define int long long
constint INF = 1e18; inlineintmin(constint x, constint y){return x < y ? x : y;} structNode { int x, y, z; inlinebooloperator < (const Node a) const {return x > a.x;} }; structEdge { int to, nxt, a, b; } e[505]; int head[55], dis[55][2505], C[55], D[55], tot, S, n, m; bool done[55][2505]; inlinevoidAddEdge(constint u, constint v, constint a, constint b){ e[++ tot].to = v, e[tot].nxt = head[u], head[u] = tot; e[tot].a = a, e[tot].b = b; } std::priority_queue<Node> Q;
voidDijkstra(){ memset(dis, 0x3f, sizeof dis); Q.push(Node{dis[1][S] = 0, 1, S}); while (Q.size()) { int u(Q.top().y), mon(Q.top().z); Q.pop(); if (done[u][mon]) continue; done[u][mon] = true; intlim(50 * n / C[u] + 1); for (inti(0); i <= 15; ++ i) if ((lim >= 1 << i)) { intnxt(min(50 * n, mon + (C[u] << i))); if (dis[u][mon] + (D[u] << i) < dis[u][nxt]) Q.push(Node{dis[u][nxt] = dis[u][mon] + (D[u] << i), u, nxt}); } for (inti(head[u]); i; i = e[i].nxt) { int v(e[i].to), x(min(n * 50, mon - e[i].a)); if (0 <= x && dis[u][mon] + e[i].b < dis[v][x]) Q.push(Node{dis[v][x] = dis[u][mon] + e[i].b, v, x}); } } }
signedmain(){ scanf("%lld%lld%lld", &n, &m, &S); S = min(S, 50 * n); for (inti(1); i <= m; ++ i) { int u, v, a, b; scanf("%lld%lld%lld%lld", &u, &v, &a, &b); AddEdge(u, v, a, b), AddEdge(v, u, a, b); } for (inti(1); i <= n; ++ i) scanf("%lld%lld", C + i, D + i); Dijkstra(); for (inti(2); i <= n; ++ i) { intans(INF); for (intj(0); j <= 50 * n; ++ j) ans = min(ans, dis[i][j]); printf("%lld\n", ans); } return0; }