Submission #1286089

#TimeUsernameProblemLanguageResultExecution timeMemory
1286089Jawad_Akbar_JJRobot (JOI21_ho_t4)C++20
24 / 100
242 ms28036 KiB
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 1<<17;
vector<pair<int,pair<int,int>>> Vec[N], Raw[N];
vector<pair<int,int>> nei[N];
int seen[N], Min[N];

void Add(int u, int v, int d, int flg = 0){
	// cout<<u<<" ";
	// cout<<(flg ? '-' : '<');
	// cout<<"---> "<<v<<" "<<" "<<d<<'\n';
	
	nei[u].push_back({v, d});
}

void dfs(int u){
	seen[u] = 1;
	sort(begin(Raw[u]), end(Raw[u]));

	for (int i=0;i<Raw[u].size();i++){
		auto [a1, b1] = Raw[u][i];

		int j = i, Sm = b1.second;
		while (j + 1 < Raw[u].size() and Raw[u][j+1].first == a1)
			j++, Sm += Raw[u][j].second.second;

		for (int k=i;k<=j;k++){
			auto [a, b] = Raw[u][k];
			Add(u, b.first, min(b.second, Sm - b.second));
			if (seen[b.first] == 0)
				dfs(b.first);
		}
		if (j == i + 1){
			auto [a2, b2] = Raw[u][i+1];
			Add(b1.first, b2.first, b1.second);
			Add(b2.first, b1.first, b2.second);
		}
		i = j;
	}
}

void dfs2(int u){
	seen[u] = 2;
	sort(begin(Vec[u]), end(Vec[u]));

	for (int i=0, id = 0;i<Raw[u].size();i++){
		auto [a1, b1] = Raw[u][i];

		int j = i, Sm = b1.first;
		while (j + 1 < Raw[u].size() and Raw[u][j+1].first == a1)
			j++, Sm += Raw[u][j].second.second;

		
		for (int k=i;k<=j;k++){
			auto [a, b] = Raw[u][k];
			if (seen[b.first] != 2)
				dfs2(b.first);
			while (id < Vec[u].size() and Vec[u][id].first == a and Vec[u][id].second.first == b.first)
				Add(u, Vec[u][id].second.second, min(b.second, Sm - b.second), 1), id++;
		}
		i = j;
	}
}

void dijkstra(int u){
	for (int i=2;i<N;i++)
		Min[i] = 1e9;
	set<pair<int,int>> st = {{0, 1}};

	while (st.size() > 0){
		auto [mn, u] = *begin(st);
		st.erase(begin(st));

		for (auto [i, w] : nei[u]){
			if (Min[u] + w < Min[i]){
				st.erase({Min[i], i});
				Min[i] = Min[u] + w;
				st.insert({Min[i], i});
			}
		}
	}
}

int main(){
	int n, m;
	cin>>n>>m;

	for (int i=1, a, b, c, d;i<=m;i++){
		cin>>a>>b>>c>>d;
		Raw[a].push_back({c, {b, d}});
		Raw[b].push_back({c, {a, d}});
	}


	dfs(1);

	// dfs2(1);

	// return 0;

	dijkstra(1);

	if (Min[n] == 1e9)
		Min[n] = -1;
	cout<<Min[n]<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...