This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define FIXED_FLOAT(x) std::fixed <<std::setprecision(20) << (x)
#define all(v) (v).begin(), (v).end()
using namespace std;
#define forn(i,n) for (int i = 0; i < (n); ++i)
#define rforn(i, n) for(int i = (n) - 1;i >= 0;--i)
#define sz(x) (int)x.size()
#define ff first
#define se second
#define mp make_pair
using ll = long long;
int mod = (ll)1e9 + 7;
const int INF = 1e9 + 1;
const int N = 2e5 + 100;
const double eps = 1e-7;
const long long inf = 1e18;
template <class T> using V = vector<T>;
template <class T> using VV = V<V<T>>;
template<class T, size_t SZ> using AR = array<T, SZ>;
template<class T> using PR = pair<T, T>;
template <typename XPAX>
bool ckma(XPAX &x, XPAX y) {
return (x < y ? x = y, 1 : 0);
}
template <typename XPAX>
bool ckmi(XPAX &x, XPAX y) {
return (x > y ? x = y, 1 : 0);
}
void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}
template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
int n, m;
struct E {
int t, c;
ll p;
};
map<int, vector<E>> g[N];
ll dp[N];
map<int, ll> dp2[N], sm[N];
void solve() {
cin >> n >> m;
forn(i, m) {
int a, b, c;
ll p;
cin >> a >> b >> c >> p;
g[a][c].push_back({b, c, p});
g[b][c].push_back({a, c, p});
sm[a][c] += p;
sm[b][c] += p;
}
fill(dp, dp + n + 1, inf);
dp[1] = 0;
priority_queue<tuple<ll, int, int>> pq;
pq.push({0, 1, 0});
while(size(pq)) {
auto [s, v, w] = pq.top();
pq.pop();
if(w) {
if(dp2[v][w] != -s)continue;
for(E &x : g[v][w]) {
ll d = -s+sm[v][w]-x.p;
if(d < dp[x.t]) {
dp[x.t] = d;
pq.push({-dp[x.t], x.t, 0});
}
}
}
else {
if(dp[v] != -s)continue;
for(auto &i : g[v]) {
for(auto x : i.se) {
ll d1 = -s+sm[v][x.c]-x.p;
if(d1 < dp[x.t]) {
dp[x.t] = d1;
pq.push({-d1, x.t, 0});
}
ll d2 = -s+x.p;
if(d2 < dp[x.t]) {
dp[x.t] = d2;
pq.push({-d2, x.t, 0});
}
ll d3 = -s;
if(!dp2[x.t].count(x.c) || d3 < dp2[x.t][x.c]) {
dp2[x.t][x.c] = d3;
pq.push({-d3, x.t, x.c});
}
}
}
}
}
cout << (dp[n] == inf ? -1 : dp[n]) << '\n';
}
void test_case() {
int t;
cin >> t;
forn(p, t) {
//cout << "Case #" << p + 1 << ": ";
solve();
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |