제출 #1346243

#제출 시각아이디문제언어결과실행 시간메모리
1346243Jawad_Akbar_JJCeste (COCI17_ceste)C++20
64 / 160
2599 ms196608 KiB
#include <iostream>
#include <queue>
#include <set>

using namespace std;
#define int long long
const int N = 2000;
vector<int> Mn[N];
vector<pair<int, int>> nei[N];
int cc[N], dd[N], Ans[N], Mn2[N], s1;

int Cost(int C, int c1, int c, int T){
	if (c1)
		T += C / c1;
	c1 += c;
	return c1 * T;
}

void dijkstra(){
	for (int i=1;i<N;i++)
		Ans[i] = 1e17, Mn2[i] = 0;
	
	// Mn[1][0] = 0;
	Mn[1].resize(1, 0);
	priority_queue<pair<int, pair<int, int>>> st;
	st.push({0, {1, 0}});

	while (st.size() > 0){
		auto [mn, pr] = st.top();
		st.pop();

		auto [u, c] = pr;
		mn = -mn;
		if (Mn[u][c] != mn)
			continue;

		Ans[u] = min(Ans[u], mn);
		Mn2[u] = min(Mn2[u], c);

		for (auto [i, e] : nei[u]){
			int C = Cost(mn, c, cc[e], dd[e]), CC = c + cc[e];
			if (Mn[i].size() < CC + 1)
				Mn[i].resize(CC + 1, 1e17);
			if (CC <= s1 and C < Mn[i][CC]){
				Mn[i][CC] = C;
				st.push({-C, {i, CC}});
			}
		}
	}
}

signed main(){
	int n, m, s2 = 0;
	cin>>n>>m;

	for (int i=1, a, b;i<=m;i++){
		cin>>a>>b>>cc[i]>>dd[i];
		s1 += cc[i];
		s2 += dd[i];
		nei[a].push_back({b, i});
		nei[b].push_back({a, i});
	}
	if (s1 > s2){
		for (int i=1;i<=m;i++)
			swap(cc[i], dd[i]);
		s1 = s2;
	}

	dijkstra();

	for (int i=2;i<=n;i++){
		if (Ans[i] == 1e17)
			Ans[i] = -1;
		cout<<Ans[i]<<'\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...