Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <vector>
- #include <queue>
- #include <set>
- #include <algorithm>
- using namespace std;
- typedef long long ll;
- typedef pair <ll, int> lli;
- const int Maxn = 100005;
- const ll Inf = 1000000000000000000ll;
- struct edge {
- int b;
- ll d, nr;
- edge(int b = 0, ll d = 0, ll nr = 0): b(b), d(d), nr(nr) { }
- };
- int t;
- int n, k, m;
- vector <edge> E;
- vector <int> neigh[Maxn];
- ll dist[Maxn];
- ll P;
- set <int> res;
- ll getP()
- {
- fill(dist, dist + n + 1, 0); dist[n] = Inf;
- priority_queue <lli> Q; Q.push(lli(Inf, n));
- while (!Q.empty()) {
- int v = Q.top().second; ll nr = Q.top().first; Q.pop();
- if (nr != dist[v]) continue;
- if (v <= k) return nr;
- for (int i = 0; i < neigh[v].size(); i++) {
- int e = neigh[v][i];
- if (min(nr, E[e].nr) > dist[E[e].b]) { dist[E[e].b] = min(nr, E[e].nr); Q.push(lli(dist[E[e].b], E[e].b)); }
- }
- }
- return 0ll;
- }
- void getRes()
- {
- fill(dist, dist + n + 1, Inf); dist[n] = 0;
- priority_queue <lli> Q; Q.push(lli(-dist[n], n));
- ll mn = Inf;
- while (!Q.empty()) {
- int v = Q.top().second; ll d = -Q.top().first; Q.pop();
- if (d != dist[v]) continue;
- if (v <= k) {
- if (d < mn) mn = d;
- if (d == mn) res.insert(v);
- }
- for (int i = 0; i < neigh[v].size(); i++) {
- int e = neigh[v][i];
- if (E[e].nr >= P && d + E[e].d < dist[E[e].b]) { dist[E[e].b] = d + E[e].d; Q.push(lli(-dist[E[e].b], E[e].b)); }
- }
- }
- }
- int main()
- {
- scanf("%d", &t);
- for (int tc = 1; tc <= t; tc++) {
- scanf("%d %d %d", &n, &k, &m);
- for (int i = 1; i <= n; i++)
- neigh[i].clear();
- E.resize(2 * m);
- for (int i = 0; i < m; i++) {
- int a, b, d, nr; scanf("%d %d %d %d", &a, &b, &d, &nr);
- E[2 * i] = edge(b, d, nr); neigh[a].push_back(2 * i);
- E[2 * i + 1] = edge(a, d, nr); neigh[b].push_back(2 * i + 1);
- }
- P = getP();
- res.clear();
- getRes();
- printf("Case #%d:", tc);
- for (set <int>::iterator it = res.begin(); it != res.end(); it++)
- printf(" %d", *it);
- printf("\n");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement