#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <queue>
#include <string>
#include <climits>
#include <cmath>
#include <set>
#include <stack>
#include <map>
#include <assert.h>
using namespace std;
using ll = long long;
#define pb push_back
#define mp make_pair
int n, m, s, t, u, v;
vector<vector<pair<int, int> > > adj; // cost first, then position
vector<int> dist(int start, vector<vector<pair<int, int> > > adj){
vector<int> ret(n, -1);
priority_queue<pair<ll, pair<int, int> >, vector<pair<ll, pair<int, int> > >, greater<pair<ll, pair<int, int> > > > pq;
pq.push(mp(0, mp(start, -1)));
while(!pq.empty()){
pair<ll, pair<int, int> > curr = pq.top(); pq.pop();
if(ret[curr.second.first] != -1){
continue;
}
ret[curr.second.first] = curr.first;
for(auto& edge: adj[curr.second.first]){
pq.push(mp(edge.first + curr.first, mp(edge.second, curr.second.first)));
}
}
return ret;
}
vector<int> prev(int start, vector<vector<pair<int, int> > > adj){
vector<int> ret(n, -1);
priority_queue<pair<ll, pair<int, int> >, vector<pair<ll, pair<int, int> > >, greater<pair<ll, pair<int, int> > > > pq;
pq.push(mp(0, mp(start, -1)));
while(!pq.empty()){
pair<ll, pair<int, int> > curr = pq.top(); pq.pop();
if(ret[curr.second.first] != -1){
continue;
}
ret[curr.second.first] = curr.second.second;
for(auto& edge: adj[curr.second.first]){
pq.push(mp(edge.first + curr.first, mp(edge.second, curr.second.first)));
}
}
return ret;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
// ifstream cin;
// cin.open("test.in");
cin >> n >> m >> s >> t >> u >> v;
adj.resize(n);
for(int i = 0; i < m; i++){
int a, b, c; cin >> a >> b >> c; a--; b--;
adj[a].pb(mp(c, b));
adj[b].pb(mp(c, a));
}
s--; t--; u--; v--;
// figure out, with the option to have gone on the train
vector<int> sdist = dist(s, adj);
vector<int> sprev = prev(s, adj);
vector<int> tdist = dist(t, adj);
vector<int> tprev = prev(t, adj);
// cout << "sdist: ";
// for(int i = 0; i < n; i++){
// cout << sdist[i] << " ";
// }
// cout << "\n";
//
// cout << "tdist: ";
// for(int i = 0; i < n; i++){
// cout << tdist[i] << " ";
// }
// cout << "\n";
vector<vector<bool> > visited(n, vector<bool>(4, false));
// 0 - haven't done it
// 1 - doing it
// 2 - already done it
priority_queue<pair<ll, pair<int, int> >, vector<pair<ll, pair<int, int> > >, greater<pair<ll, pair<int, int> > > > pq; // <distance, <pos, 0-1-2> >
pq.push(mp(0, mp(u, 0)));
while(!pq.empty()){
pair<ll, pair<int, int> > curr = pq.top(); pq.pop();
if(visited[curr.second.first][curr.second.second]){
continue;
}
visited[curr.second.first][curr.second.second] = true;
// cout << "minimum distance " << (curr.second.first + 1) << " " << curr.second.second << " " << " is " << curr.first << "\n";
if(curr.second.first == v){
cout << curr.first << "\n";
return 0;
}
for(auto& edge: adj[curr.second.first]){
bool isOnPath = (edge.first + sdist[edge.second] + tdist[curr.second.first]) == sdist[t] || (edge.first + sdist[curr.second.first] + tdist[edge.second] == tdist[s]);
if(curr.second.second == 0){ // haven't started
if(isOnPath && tdist[edge.second] < tdist[curr.second.first]){
pq.push(mp(curr.first, mp(edge.second, 1)));
}
if(isOnPath && sdist[edge.second] < sdist[curr.second.first]){
pq.push(mp(curr.first, mp(edge.second, 2)));
}
pq.push(mp(curr.first + edge.first, mp(edge.second, 0)));
} else if (curr.second.second == 1){ // moving to t
if(isOnPath && tdist[edge.second] < tdist[curr.second.first]){
pq.push(mp(curr.first, mp(edge.second, 1)));
} else {
pq.push(mp(curr.first + edge.first, mp(edge.second, 3)));
}
} else if (curr.second.second == 2){ // moving to s
// is the distance from
if(isOnPath && sdist[edge.second] < sdist[curr.second.first]){
pq.push(mp(curr.first, mp(edge.second, 2)));
} else {
pq.push(mp(curr.first + edge.first, mp(edge.second, 3)));
}
} else { // done
pq.push(mp(curr.first + edge.first, mp(edge.second, 3)));
}
}
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
579 ms |
34096 KB |
Output is correct |
2 |
Correct |
565 ms |
28212 KB |
Output is correct |
3 |
Correct |
707 ms |
35104 KB |
Output is correct |
4 |
Correct |
687 ms |
33444 KB |
Output is correct |
5 |
Correct |
598 ms |
29040 KB |
Output is correct |
6 |
Correct |
664 ms |
34376 KB |
Output is correct |
7 |
Correct |
456 ms |
25376 KB |
Output is correct |
8 |
Correct |
471 ms |
25688 KB |
Output is correct |
9 |
Correct |
523 ms |
27688 KB |
Output is correct |
10 |
Incorrect |
565 ms |
34232 KB |
Output isn't correct |
11 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
490 ms |
25708 KB |
Output is correct |
2 |
Correct |
579 ms |
28916 KB |
Output is correct |
3 |
Correct |
504 ms |
25432 KB |
Output is correct |
4 |
Correct |
437 ms |
24592 KB |
Output is correct |
5 |
Correct |
619 ms |
28580 KB |
Output is correct |
6 |
Correct |
720 ms |
34604 KB |
Output is correct |
7 |
Correct |
500 ms |
24224 KB |
Output is correct |
8 |
Correct |
645 ms |
33296 KB |
Output is correct |
9 |
Correct |
499 ms |
27444 KB |
Output is correct |
10 |
Correct |
419 ms |
25320 KB |
Output is correct |
11 |
Correct |
214 ms |
18716 KB |
Output is correct |
12 |
Correct |
700 ms |
34972 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
30 ms |
2692 KB |
Output is correct |
2 |
Correct |
1 ms |
332 KB |
Output is correct |
3 |
Correct |
1 ms |
320 KB |
Output is correct |
4 |
Correct |
63 ms |
4896 KB |
Output is correct |
5 |
Correct |
33 ms |
3276 KB |
Output is correct |
6 |
Correct |
3 ms |
360 KB |
Output is correct |
7 |
Correct |
4 ms |
588 KB |
Output is correct |
8 |
Correct |
4 ms |
584 KB |
Output is correct |
9 |
Correct |
2 ms |
480 KB |
Output is correct |
10 |
Correct |
43 ms |
4544 KB |
Output is correct |
11 |
Correct |
1 ms |
332 KB |
Output is correct |
12 |
Correct |
2 ms |
332 KB |
Output is correct |
13 |
Correct |
1 ms |
332 KB |
Output is correct |
14 |
Correct |
2 ms |
332 KB |
Output is correct |
15 |
Correct |
2 ms |
332 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
579 ms |
34096 KB |
Output is correct |
2 |
Correct |
565 ms |
28212 KB |
Output is correct |
3 |
Correct |
707 ms |
35104 KB |
Output is correct |
4 |
Correct |
687 ms |
33444 KB |
Output is correct |
5 |
Correct |
598 ms |
29040 KB |
Output is correct |
6 |
Correct |
664 ms |
34376 KB |
Output is correct |
7 |
Correct |
456 ms |
25376 KB |
Output is correct |
8 |
Correct |
471 ms |
25688 KB |
Output is correct |
9 |
Correct |
523 ms |
27688 KB |
Output is correct |
10 |
Incorrect |
565 ms |
34232 KB |
Output isn't correct |
11 |
Halted |
0 ms |
0 KB |
- |