QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#91293#4382. PathToboAC ✓548ms64488kbC++202.0kb2023-03-28 11:24:462023-03-28 11:24:49

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-03-28 11:24:49]
  • Judged
  • Verdict: AC
  • Time: 548ms
  • Memory: 64488kb
  • [2023-03-28 11:24:46]
  • Submitted

answer

#include <bits/stdc++.h>
#define N 1000005
using i64 = long long;
using namespace std;

int n, m, s, k, vis[2][N];
i64 dis[2][N];
vector<array<int, 3>> adj[N];
struct node
{
    int type, x;
    i64 dis;
    bool operator<(const node &tmp) const { return dis > tmp.dis; }
};
void solve()
{
    cin >> n >> m >> s >> k;
    set<int> st;
    for (int i = 1; i <= n; i++)
        st.insert(i);
    for (int i = 1, u, v, w, r; i <= m; i++)
    {
        cin >> u >> v >> w >> r;
        adj[u].push_back({v, w, r});
    }
    priority_queue<node> que;
    que.push({0, s, 0});
    fill(dis[0] + 1, dis[0] + n + 1, 1e18);
    fill(dis[1] + 1, dis[1] + n + 1, 1e18);
    fill(vis[0] + 1, vis[0] + n + 1, 0);
    fill(vis[1] + 1, vis[1] + n + 1, 0);
    dis[0][s] = 0;
    vector<int> col(n + 1);
    while (!que.empty())
    {
        auto [p, cur, _] = que.top();
        que.pop();
        if (vis[p][cur])
            continue;
        vis[p][cur] = 1;
        st.erase(cur);
        if (p)
        {
            for (const auto &[i, _, _1] : adj[cur])
                col[i] = cur;
            for (int i : st)
            {
                if (col[i] != cur)
                {
                    dis[0][i] = dis[p][cur];
                    que.push({0, i, dis[0][i]});
                }
            }
        }
        int d = p ? -k : 0;
        for (auto &t : adj[cur])
        {
            if (dis[t[2]][t[0]] > dis[p][cur] + d + t[1])
            {
                dis[t[2]][t[0]] = dis[p][cur] + d + t[1];
                que.push({t[2], t[0], dis[t[2]][t[0]]});
            }
        }
    }
    for (int i = 1; i <= n; i++)
    {
        i64 ans = min(dis[0][i], dis[1][i]);
        if (ans == 1e18)
            ans = -1;
        cout << ans << ' ';
        adj[i].clear();
    }
    cout << '\n';
}
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    cin >> t;
    while (t--)
        solve();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 548ms
memory: 64488kb

input:

13
10 30 2 18468
5 1 37637 0
9 9 45430 0
6 6 41749 0
2 2 21463 1
8 7 50859 0
3 4 18760 0
2 7 38186 0
8 7 33239 0
10 3 44135 0
6 5 47171 0
3 4 36141 0
2 2 46721 0
8 5 51130 0
8 10 27191 0
10 9 30784 0
1 3 18756 0
1 3 37732 0
7 6 34358 0
1 1 33474 0
4 9 38097 0
5 5 37224 0
7 7 32399 0
5 10 43094 0
8 9...

output:

21463 0 21463 21463 21463 45392 38186 21463 21463 21463 
41923 0 45987 49920 18690 52316 71251 52316 25059 52316 
57062 34860 18647 36256 49111 29152 32554 62744 0 38939 
56122 64474 0 -1 84001 29542 39504 -1 -1 38273 
46451 44825 44825 44825 57660 38488 44825 44825 44825 0 
51281 91636 44602 39997 ...

result:

ok 13 lines