# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
761793 |
2023-06-20T09:41:08 Z |
sysia |
Robot (JOI21_ho_t4) |
C++17 |
|
896 ms |
85644 KB |
//Sylwia Sapkowska
#include <bits/stdc++.h>
#pragma GCC optimize("O3", "unroll-loops")
using namespace std;
void __print(int x) {cerr << x;}
void __print(long long 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...);}
#ifdef LOCAL
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif
#define int long long
typedef pair<int, int> T;
const int oo = 1e18, oo2 = 1e9+7, K = 30;
const int mod = 998244353;
typedef tuple<int, int, int> F;
void solve(){
int n, m; cin >> n >> m;
vector<map<int, vector<T>>>g(n+1);
vector<map<int, int>>dp(n+1), sum(n+1);
for (int i = 0; i<m; i++){
int a, b, c, p; cin >> a >> b >> c >> p;
g[a][c].emplace_back(b, p);
g[b][c].emplace_back(a, p);
dp[a][c] = oo;
dp[b][c] = oo;
sum[a][c] += p;
sum[b][c] += p;
}
// if (m == 1){
// for (auto [x, c, p]: g[1]){
// if (x == n){
// cout << "0\n";
// return;
// }
// }
// cout << "-1\n";
// return;
// }
priority_queue<F, vector<F>, greater<F>>pq;
pq.push({0, 1, -1});
//dp[v][c] = min koszt dotarcia do v z uzyciem ostatniej krawedzi c, z wymuszeniem jej zmiany pozniej na sciezce
//dist[v] = min koszt po prostu dotarcia do v
//stanow jest O(sum of deg v + n) = O(m + n) ?????
vector<int>dist(n+1, oo);
dist[1] = 0;
while ((int)pq.size()){
auto [d, v, c] = pq.top(); pq.pop();
if (c == -1){
if (dist[v] < d) continue;
//nie wymuszamy zmiany koloru poprzedniej krawedzi
for (auto [e, vt]: g[v]){
for (auto [x, p]: vt){
//a) nie zmieniamy koloru krawedzi v---x (czyli nie wymuszamy tez zadnej zmiany)
int cost1 = sum[v][e] - p;
if (dist[x] > d + cost1){
dist[x] = d+cost1;
pq.push({dist[x], x, -1});
}
//b) zmieniamy kolor krawedzi c, ale dalej nie wymuszamy zmiany
//dirichlet ---> zawsze istnieje kolor na jaki mozemy zmienic
int cost2 = p;
if (dist[x] > d + cost2){
dist[x] = d+cost2;
pq.push({dist[x], x, -1});
}
//c) zmieniamy kolor krawedzi c, z wymuszeniem zmiany na pozniej dla nastepnej krawedzi na sciezce
int cost3 = 0;
if (dp[x][e] > d){
dp[x][e] = d;
pq.push({d, x, e});
}
}
}
} else {
if (dp[v][c] < d) continue;
//wymuszamy zmiane poprzedniej krawedzi c
for (auto [x, p]: g[v][c]){
int cost = sum[v][c] - p;
if (dist[x] > d + cost){
dist[x] = d+cost;
//nie oplaca sie zamieniac dwoch sasiednich krawedzi na optymalnej sciezce z koloru c na jakis inny kolor
//gdyby tak bylo, to moglibysmy usunac jedna zmiane i miec lepszy wynik
//wiec teraz nie wymuszamy zmiany koloru c
pq.push({dist[x], x, -1});
}
}
}
}
if (dist[n] == oo) cout << "-1\n";
else cout << dist[n] << "\n";
}
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}
Compilation message
Main.cpp: In function 'void solve()':
Main.cpp:84:10: warning: unused variable 'cost3' [-Wunused-variable]
84 | int cost3 = 0;
| ^~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
0 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
340 KB |
Output is correct |
6 |
Correct |
0 ms |
212 KB |
Output is correct |
7 |
Correct |
1 ms |
468 KB |
Output is correct |
8 |
Correct |
1 ms |
340 KB |
Output is correct |
9 |
Correct |
4 ms |
1108 KB |
Output is correct |
10 |
Correct |
3 ms |
980 KB |
Output is correct |
11 |
Correct |
2 ms |
852 KB |
Output is correct |
12 |
Correct |
2 ms |
852 KB |
Output is correct |
13 |
Correct |
2 ms |
852 KB |
Output is correct |
14 |
Correct |
2 ms |
852 KB |
Output is correct |
15 |
Correct |
1 ms |
724 KB |
Output is correct |
16 |
Correct |
2 ms |
724 KB |
Output is correct |
17 |
Correct |
2 ms |
724 KB |
Output is correct |
18 |
Correct |
1 ms |
596 KB |
Output is correct |
19 |
Correct |
2 ms |
468 KB |
Output is correct |
20 |
Correct |
1 ms |
724 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
127 ms |
23436 KB |
Output is correct |
2 |
Correct |
44 ms |
12676 KB |
Output is correct |
3 |
Correct |
114 ms |
19164 KB |
Output is correct |
4 |
Correct |
81 ms |
16660 KB |
Output is correct |
5 |
Correct |
885 ms |
80480 KB |
Output is correct |
6 |
Correct |
677 ms |
74044 KB |
Output is correct |
7 |
Correct |
316 ms |
64356 KB |
Output is correct |
8 |
Correct |
355 ms |
50972 KB |
Output is correct |
9 |
Correct |
366 ms |
51128 KB |
Output is correct |
10 |
Correct |
265 ms |
44072 KB |
Output is correct |
11 |
Correct |
114 ms |
35076 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
0 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
340 KB |
Output is correct |
6 |
Correct |
0 ms |
212 KB |
Output is correct |
7 |
Correct |
1 ms |
468 KB |
Output is correct |
8 |
Correct |
1 ms |
340 KB |
Output is correct |
9 |
Correct |
4 ms |
1108 KB |
Output is correct |
10 |
Correct |
3 ms |
980 KB |
Output is correct |
11 |
Correct |
2 ms |
852 KB |
Output is correct |
12 |
Correct |
2 ms |
852 KB |
Output is correct |
13 |
Correct |
2 ms |
852 KB |
Output is correct |
14 |
Correct |
2 ms |
852 KB |
Output is correct |
15 |
Correct |
1 ms |
724 KB |
Output is correct |
16 |
Correct |
2 ms |
724 KB |
Output is correct |
17 |
Correct |
2 ms |
724 KB |
Output is correct |
18 |
Correct |
1 ms |
596 KB |
Output is correct |
19 |
Correct |
2 ms |
468 KB |
Output is correct |
20 |
Correct |
1 ms |
724 KB |
Output is correct |
21 |
Correct |
127 ms |
23436 KB |
Output is correct |
22 |
Correct |
44 ms |
12676 KB |
Output is correct |
23 |
Correct |
114 ms |
19164 KB |
Output is correct |
24 |
Correct |
81 ms |
16660 KB |
Output is correct |
25 |
Correct |
885 ms |
80480 KB |
Output is correct |
26 |
Correct |
677 ms |
74044 KB |
Output is correct |
27 |
Correct |
316 ms |
64356 KB |
Output is correct |
28 |
Correct |
355 ms |
50972 KB |
Output is correct |
29 |
Correct |
366 ms |
51128 KB |
Output is correct |
30 |
Correct |
265 ms |
44072 KB |
Output is correct |
31 |
Correct |
114 ms |
35076 KB |
Output is correct |
32 |
Correct |
80 ms |
15404 KB |
Output is correct |
33 |
Correct |
88 ms |
20416 KB |
Output is correct |
34 |
Correct |
313 ms |
43684 KB |
Output is correct |
35 |
Correct |
247 ms |
35252 KB |
Output is correct |
36 |
Correct |
270 ms |
49116 KB |
Output is correct |
37 |
Correct |
302 ms |
55316 KB |
Output is correct |
38 |
Correct |
304 ms |
62488 KB |
Output is correct |
39 |
Correct |
87 ms |
20260 KB |
Output is correct |
40 |
Correct |
361 ms |
52172 KB |
Output is correct |
41 |
Correct |
366 ms |
52556 KB |
Output is correct |
42 |
Correct |
438 ms |
63576 KB |
Output is correct |
43 |
Correct |
156 ms |
29176 KB |
Output is correct |
44 |
Correct |
264 ms |
31840 KB |
Output is correct |
45 |
Correct |
273 ms |
47660 KB |
Output is correct |
46 |
Correct |
229 ms |
47940 KB |
Output is correct |
47 |
Correct |
275 ms |
54512 KB |
Output is correct |
48 |
Correct |
896 ms |
85644 KB |
Output is correct |