Submission #696629

#TimeUsernameProblemLanguageResultExecution timeMemory
696629TranGiaHuy1508Autobus (COCI22_autobus)C++17
70 / 70
151 ms596 KiB
#include <bits/stdc++.h>
using namespace std;

void main_program();

signed main(){
	ios_base::sync_with_stdio(0); cin.tie(0);
	main_program();
}

#define int long long
const int inf = 1e18;

struct Matrix{
	vector<vector<int>> v;
	int r, c;

	Matrix() = default;
	Matrix(int R): Matrix(R, R) {
		for (int i = 0; i < R; i++) v[i][i] = 0;
	}
	Matrix(int R, int C): r(R), c(C) {
		v.assign(R, vector<int>(C, inf));
	}

	Matrix operator * (const Matrix &M){
		Matrix res(r, M.c);
		for (int i = 0; i < r; i++){
			for (int k = 0; k < c; k++){
				for (int j = 0; j < M.c; j++){
					res.v[i][j] = min(res.v[i][j], v[i][k] + M.v[k][j]);
				}
			}
		}
		return res;
	}

	Matrix operator ^ (int a){
		Matrix res(r);
		for (Matrix exp = *this; a; a >>= 1, exp = exp * exp){
			if (a & 1) res = res * exp;
		}
		return res;
	}
};

void main_program(){
	int n, m; cin >> n >> m;
	
	Matrix mult(n);

	for (int i = 0; i < m; i++){
		int a, b, w; cin >> a >> b >> w;
		a--; b--;
		mult.v[a][b] = min(mult.v[a][b], w);
	}

	int k, q; cin >> k >> q;
	mult = mult ^ k;

	for (int qr = 0; qr < q; qr++){
		int c, d; cin >> c >> d;
		c--; d--;
		Matrix base(1, n); base.v[0][c] = 0;
		Matrix res = base * mult;

		if (res.v[0][d] == inf) cout << "-1\n";
		else cout << res.v[0][d] << "\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...