QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#460486#4382. PathhorzwardAC ✓318ms61684kbC++172.0kb2024-07-01 17:39:392024-07-01 17:39:39

Judging History

This is the latest submission verdict.

  • [2024-07-01 17:39:39]
  • Judged
  • Verdict: AC
  • Time: 318ms
  • Memory: 61684kb
  • [2024-07-01 17:39:39]
  • Submitted

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