Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <tuple>
- #include <vector>
- #include <queue> //priority queue
- #include <utility> //pair
- using namespace std;
- #define maxn 200006
- #define INF 12334857394875ll
- #define pii pair<long long,long long>
- long long dis1[maxn];
- long long dis2[maxn];
- vector<pii> G1[maxn];
- vector<pii> G2[maxn];
- int t;
- long long n, m; // n nodes and m edges
- int a, b;//travel from a to b
- long long c, d, e; // it takes e to go from c to d
- void dijk1(long long n) {
- for (int i=0;i<=n;++i) {
- dis1[i] = INF;
- }
- dis1[a] = 0; //從誰開始
- priority_queue< pii, vector<pii>, greater<pii> > pq;
- pq.push(make_pair(dis1[a],a));
- while (!pq.empty()) {
- pii p = pq.top();
- pq.pop();
- long long disid = p.first;
- long long id = p.second;
- if (dis1[id] != disid) continue; // 如果新丟出來的單行道並不是最優的一條,就不討論它
- for (pii q:G1[id]) {
- long long to = q.first;
- long long wei = q.second;
- if (dis1[to] > disid + wei) {
- dis1[to] = disid + wei;
- pq.push(make_pair(dis1[to],to));
- }
- }
- }
- }
- void dijk2(long long n) {
- for (int i=0;i<=n;++i) {
- dis2[i] = INF;
- }
- dis2[b] = 0; //從誰開始
- priority_queue< pii, vector<pii>, greater<pii> > pq;
- pq.push(make_pair(dis2[b],b));
- while (!pq.empty()) {
- pii p = pq.top();
- pq.pop();
- long long disid = p.first;
- long long id = p.second;
- if (dis2[id] != disid) continue;
- for (pii q:G2[id]) {
- long long to = q.first;
- long long wei = q.second;
- if (dis2[to] > disid + wei) {
- dis2[to] = disid + wei;
- pq.push(make_pair(dis2[to],to));
- }
- }
- }
- }
- long long aa[maxn], ab[maxn], ac[maxn];
- int main() {
- ios::sync_with_stdio(0); cin.tie(0);
- cin >> t;
- for(int i=0; i<t; ++i){
- for(int i=0; i<n; i++){
- G1[i].clear();
- G2[i].clear();
- }
- cin >> n>> m >> a >> b;
- for(int i=0; i<m; ++i){
- cin >> c >> d>> e;
- // x --> y, weight = z
- // G[x].push_back(make_pair(y,z));
- G1[c].push_back(make_pair(d,e));
- G2[d].push_back(make_pair(c,e));
- aa[i]=c;
- ab[i]=d;
- ac[i]=e;
- // vector<tuple<int, int, int>> edges;
- // tuple<int, int, int> edge = make_tuple(e, c, d);
- // edges.push_back(edge);
- }
- dijk1(n);
- dijk2(n);
- long long min=INF;
- long long length;
- // bool ok;
- for(int i =0; i<m; i++){
- length=dis1[aa[i]]+dis2[ab[i]]+ac[i];
- if(length!=dis1[b]){
- if(length<min) min=length;
- }
- }
- cout << (min-dis1[b]) << endl;
- }
- }
- /*
- #define INF 12334857394875ll
- #define pii pair<int,int> pii;
- long long dis[maxn];
- vector<pii> G[maxn];
- //x --> y, weight = z
- //G[x].push_back(make_pair(y,z));
- void dijk(int n) {
- for (int i=0;i<n;++i) {
- dis[i] = INF;
- }
- dis[0] = 0;
- prioirity_queue< pii, vector<pii>, greater<pii> > pq;
- pq.push(make_pair(dis[0],0));
- while (!pq.empty()) {
- pii p = pq.top();
- pq.pop();
- int disid = p.first;
- int id = p.second;
- for (pii q:G[id]) {
- int to = q.first;
- int wei = q.second;
- if (dis[to] > disid + wei) {
- dis[to] = disid + wei;
- pq.push(make_pair(dis[to],to));
- }
- }
- }
- }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement