QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#460486 | #4382. Path | horzward | AC ✓ | 318ms | 61684kb | C++17 | 2.0kb | 2024-07-01 17:39:39 | 2024-07-01 17:39:39 |
Judging History
answer
#include <bits/stdc++.h>
#pragma GCC optimize("trapv")
using namespace std;
const int N = 1e6+5;
struct edge
{
int id;
long long len;
bool flag;
bool operator<(const edge &x) const
{
if(x.len != len)
return len > x.len;
return id > x.id;
}
};
vector<edge> a[N];
long long dis[N][2];
int bel[N];
priority_queue<edge> pq;
set<int> s;
void dijk(int start, long long K)
{
pq.push({start, 0, 0});
dis[start][0] = 0;
int cnt = 0;
while(!pq.empty())
{
edge now = pq.top();
pq.pop();
if(dis[now.id][now.flag] != now.len)
continue;
s.erase(now.id);
if(now.flag)
{
cnt++;
vector<int> del;
for(const edge &i: a[now.id])
bel[i.id] = cnt;
for(int i: s)
{
if(bel[i] != cnt)
del.push_back(i);
if(bel[i] == cnt || dis[i][0] <= now.len)
continue;
dis[i][0] = now.len;
pq.push({i, now.len, 0});
}
for(int i: del)
s.erase(i);
for(const edge &i: a[now.id])
{
int len = now.len + i.len - K;
if(dis[i.id][i.flag] > len)
{
dis[i.id][i.flag] = len;
pq.push({i.id, len, i.flag});
}
}
}
else
{
for(const edge &i: a[now.id])
{
if(dis[i.id][i.flag] > now.len + i.len)
{
dis[i.id][i.flag] = now.len + i.len;
pq.push({i.id, now.len+i.len, i.flag});
}
}
}
}
}
void solve()
{
int n, m, start;
long long k;
cin >> n >> m >> start >> k;
pq = priority_queue<edge>();
s = set<int>();
for(int i=1; i<=n; i++)
{
a[i].clear();
dis[i][0] = dis[i][1] = 1e18;
bel[i] = 0;
s.insert(i);
}
for(int i=0, w, x, y, z; i<m; i++)
{
cin >> w >> x >> y >> z;
a[w].push_back({x, 1LL*y, z});
}
dijk(start, k);
const long long INF = 1e18;
for(int i=1; i<=n; i++)
{
long long len = min(dis[i][0], dis[i][1]);
cout << (len==INF? -1: len) << " ";
}
cout << "\n";
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int tc;
cin >> tc;
while(tc--)
solve();
}
详细
Test #1:
score: 100
Accepted
time: 318ms
memory: 61684kb
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