Submission #1040136

#TimeUsernameProblemLanguageResultExecution timeMemory
1040136sssamuiRobot (JOI21_ho_t4)C++17
100 / 100
751 ms93448 KiB
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
using namespace std;
using ll = long long;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n, m;
	cin >> n >> m;
	vector<map<int, pair<vector<pair<ll, int>>, ll>>> adj(n + 1);
	vector<map<int, ll>> sm(n + 1);
	while (m--)
	{
		int a, b, c;
		ll p;
		cin >> a >> b >> c >> p;
		adj[a][c].first.push_back({ p, b }), adj[b][c].first.push_back({ p, a });
		adj[a][c].second += p, adj[b][c].second += p;
	}

	vector<ll> dp1(n + 1, -1);
	vector<map<int, ll>> dp2(n + 1);
	priority_queue<pair<pair<ll, int>, pair<bool, int>>> djk;
	djk.push({ {0, 1}, {false, 0} });
	while (!djk.empty())
	{
		ll d = -djk.top().first.first;
		int node = djk.top().first.second, lstc = djk.top().second.second;
		bool dp12 = djk.top().second.first;
		djk.pop();
		if (!dp12) if (dp1[node] == -1)
		{
			dp1[node] = d;
			for (auto edgset : adj[node]) for (pair<ll, int> nxt : edgset.second.first)
			{
				djk.push({ {-d, nxt.second}, {true, edgset.first} });
				djk.push({ {-d - nxt.first, nxt.second}, {false, edgset.first} });
				djk.push({ {-d - (edgset.second.second - nxt.first), nxt.second},{false, edgset.first} });
			}
		}

		if (dp12) if (dp2[node].count(lstc) == 0)
		{
			dp2[node][lstc] = d;
			for (pair<ll, int> nxt : adj[node][lstc].first) djk.push({ {-d - (adj[node][lstc].second - nxt.first), nxt.second}, {false, lstc} });
		}
	}

	cout << dp1[n];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...