#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define endl '\n'
#define MASK(i) (1LL << (i))
#define ull unsigned long long
#define ld long double
#define pb push_back
#define all(x) (x).begin() , (x).end()
#define BIT(x , i) ((x >> (i)) & 1)
#define TASK "task"
#define sz(s) (int) (s).size()
using namespace std;
const int mxN = 3e5 + 227;
const int inf = 1e9 + 277;
const int mod = 1e9 + 7;
const ll infll = 1e18 + 7;
const int base = 307;
const int LOG = 20;
template <typename T1, typename T2> bool minimize(T1 &a, T2 b) {
if (a > b) {a = b; return true;} return false;
}
template <typename T1, typename T2> bool maximize(T1 &a, T2 b) {
if (a < b) {a = b; return true;} return false;
}
struct EDGE{
int v , color , cost;
};
int n , m;
vector<EDGE> adj[mxN];
ll dist[mxN];
unordered_map<int , ll> dp[mxN];
int cnt[mxN];
unordered_map<int , ll> sumcost[mxN];
unordered_map<int , vector<pair<int , int>>> adjcolor[mxN];
void solve()
{
cin >> n >> m;
for(int i = 1 ; i <= m ; i++) {
int u , v , color , cost;
cin >> u >> v >> color >> cost;
adj[u].pb({v , color , cost});
adj[v].pb({u , color , cost});
adjcolor[u][color].pb({v , cost});
adjcolor[v][color].pb({u , cost});
sumcost[u][color] += cost;
sumcost[v][color] += cost;
}
memset(dist , 0x3f , sizeof(dist));
priority_queue <tuple <ll, int, int>, vector <tuple <ll, int, int>>, greater <tuple <ll, int, int>>> pq;
pq.push({dist[1] = 0 , 1 , 0});
while(!pq.empty()) {
int u , pre;
ll d;
tie(d , u , pre) = pq.top();
pq.pop();
if(pre == 0 && dist[u] != d) continue;
if(pre == 0) {
for(auto it : adj[u]) {
if(!dp[it.v].count(it.color) || dp[it.v][it.color] > d) {
dp[it.v][it.color] = d;
pq.push({d , it.v , it.color});
}
if(minimize(dist[it.v] , d + sumcost[u][it.color] - it.cost) == true) {
pq.push({d + sumcost[u][it.color] - it.cost , it.v , 0});
}
if(minimize(dist[it.v] , d + it.cost) == true) {
pq.push({d + it.cost , it.v , 0});
}
}
}
if(pre != 0) {
if(pre != 0 && dp[u][pre] != d) continue;
for(auto it : adjcolor[u][pre]) {
if(minimize(dist[it.fi] , d + sumcost[u][pre] - it.se) == true) {
pq.push({d + sumcost[u][pre] - it.se , it.fi , 0});
}
}
}
}
ll ans = dist[n];
if(ans == dist[0]) cout << -1;
else cout << ans;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
//freopen(TASK".inp" , "r" , stdin);
//freopen(TASK".out" , "w" , stdout);
int tc = 1;
//cin >> tc;
while(tc--) {
solve();
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
30 ms |
58948 KB |
Output is correct |
2 |
Correct |
29 ms |
59016 KB |
Output is correct |
3 |
Correct |
29 ms |
58976 KB |
Output is correct |
4 |
Correct |
30 ms |
59072 KB |
Output is correct |
5 |
Correct |
30 ms |
59100 KB |
Output is correct |
6 |
Correct |
30 ms |
59084 KB |
Output is correct |
7 |
Correct |
30 ms |
59204 KB |
Output is correct |
8 |
Correct |
31 ms |
59124 KB |
Output is correct |
9 |
Correct |
32 ms |
59860 KB |
Output is correct |
10 |
Correct |
34 ms |
59836 KB |
Output is correct |
11 |
Correct |
33 ms |
59672 KB |
Output is correct |
12 |
Correct |
33 ms |
59552 KB |
Output is correct |
13 |
Correct |
33 ms |
59616 KB |
Output is correct |
14 |
Correct |
33 ms |
59596 KB |
Output is correct |
15 |
Correct |
32 ms |
59540 KB |
Output is correct |
16 |
Correct |
34 ms |
59648 KB |
Output is correct |
17 |
Correct |
34 ms |
59548 KB |
Output is correct |
18 |
Correct |
32 ms |
59340 KB |
Output is correct |
19 |
Correct |
32 ms |
59312 KB |
Output is correct |
20 |
Correct |
33 ms |
59492 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
230 ms |
80944 KB |
Output is correct |
2 |
Correct |
121 ms |
70960 KB |
Output is correct |
3 |
Correct |
269 ms |
77408 KB |
Output is correct |
4 |
Correct |
171 ms |
76084 KB |
Output is correct |
5 |
Correct |
879 ms |
140300 KB |
Output is correct |
6 |
Correct |
755 ms |
131096 KB |
Output is correct |
7 |
Correct |
455 ms |
123568 KB |
Output is correct |
8 |
Correct |
585 ms |
119908 KB |
Output is correct |
9 |
Correct |
606 ms |
120004 KB |
Output is correct |
10 |
Correct |
421 ms |
100076 KB |
Output is correct |
11 |
Correct |
232 ms |
90352 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
30 ms |
58948 KB |
Output is correct |
2 |
Correct |
29 ms |
59016 KB |
Output is correct |
3 |
Correct |
29 ms |
58976 KB |
Output is correct |
4 |
Correct |
30 ms |
59072 KB |
Output is correct |
5 |
Correct |
30 ms |
59100 KB |
Output is correct |
6 |
Correct |
30 ms |
59084 KB |
Output is correct |
7 |
Correct |
30 ms |
59204 KB |
Output is correct |
8 |
Correct |
31 ms |
59124 KB |
Output is correct |
9 |
Correct |
32 ms |
59860 KB |
Output is correct |
10 |
Correct |
34 ms |
59836 KB |
Output is correct |
11 |
Correct |
33 ms |
59672 KB |
Output is correct |
12 |
Correct |
33 ms |
59552 KB |
Output is correct |
13 |
Correct |
33 ms |
59616 KB |
Output is correct |
14 |
Correct |
33 ms |
59596 KB |
Output is correct |
15 |
Correct |
32 ms |
59540 KB |
Output is correct |
16 |
Correct |
34 ms |
59648 KB |
Output is correct |
17 |
Correct |
34 ms |
59548 KB |
Output is correct |
18 |
Correct |
32 ms |
59340 KB |
Output is correct |
19 |
Correct |
32 ms |
59312 KB |
Output is correct |
20 |
Correct |
33 ms |
59492 KB |
Output is correct |
21 |
Correct |
230 ms |
80944 KB |
Output is correct |
22 |
Correct |
121 ms |
70960 KB |
Output is correct |
23 |
Correct |
269 ms |
77408 KB |
Output is correct |
24 |
Correct |
171 ms |
76084 KB |
Output is correct |
25 |
Correct |
879 ms |
140300 KB |
Output is correct |
26 |
Correct |
755 ms |
131096 KB |
Output is correct |
27 |
Correct |
455 ms |
123568 KB |
Output is correct |
28 |
Correct |
585 ms |
119908 KB |
Output is correct |
29 |
Correct |
606 ms |
120004 KB |
Output is correct |
30 |
Correct |
421 ms |
100076 KB |
Output is correct |
31 |
Correct |
232 ms |
90352 KB |
Output is correct |
32 |
Correct |
156 ms |
73956 KB |
Output is correct |
33 |
Correct |
260 ms |
79932 KB |
Output is correct |
34 |
Correct |
479 ms |
100108 KB |
Output is correct |
35 |
Correct |
399 ms |
93888 KB |
Output is correct |
36 |
Correct |
451 ms |
114468 KB |
Output is correct |
37 |
Correct |
532 ms |
117336 KB |
Output is correct |
38 |
Correct |
495 ms |
122372 KB |
Output is correct |
39 |
Correct |
240 ms |
80312 KB |
Output is correct |
40 |
Correct |
639 ms |
121328 KB |
Output is correct |
41 |
Correct |
640 ms |
121412 KB |
Output is correct |
42 |
Correct |
648 ms |
122008 KB |
Output is correct |
43 |
Correct |
251 ms |
83008 KB |
Output is correct |
44 |
Correct |
424 ms |
86944 KB |
Output is correct |
45 |
Correct |
518 ms |
117240 KB |
Output is correct |
46 |
Correct |
483 ms |
116036 KB |
Output is correct |
47 |
Correct |
465 ms |
116984 KB |
Output is correct |
48 |
Correct |
986 ms |
145996 KB |
Output is correct |