제출 #670504

#제출 시각아이디문제언어결과실행 시간메모리
670504Quan2003Robot (JOI21_ho_t4)C++17
100 / 100
1078 ms141560 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int sz=5e5+1;
const long long bignum = 1e18;
int n,x,k,i,j,w,m;
int movex[4]={0,0,1,-1};
int movey[4]={-1,1,0,0};
map<long long,long long>dpx[sz];
long long dp[sz];
map<long long,long long>col[sz];
map<long long,vector<pair<pair<int,int>,long long>>>adj[sz];
void dijsktra(int src){
     using T = pair<long long,pair<int,int>>;
     priority_queue<T,vector<T>,greater<T>>pq; 
     pq.push({0,{src,0}});
     for(int i = 1; i <= n; i++) dp[i] = bignum;
     dp[src] = 0;
     while(pq.size()){
            long long x; pair<int,int>v;
            tie(x,v) = pq.top(); pq.pop();
            if(v.second){
                if(dpx[v.first][v.second] != x) continue;
                for(auto c : adj[v.first][v.second]){
                         long long cost = x + col[v.first][v.second] - c.second;
                         if(cost < dp[c.first.first]){
                              dp[c.first.first] = cost ;
                              pq.push({dp[c.first.first],{c.first.first,0}});
                         }
                   }
            }
            else{
               if(dp[v.first] != x ) continue;
               for(auto it: adj[v.first]){
                   for(auto cur: it.second){
                       int des = cur.first.first;
                       int color = cur.first.second;
                       if(dp[des] > dp[v.first] + cur.second){
                            dp[des] = dp[v.first] + cur.second;
                            pq.push({dp[des],{des,0}});
                       }
                       if(dp[des] > dp[v.first]+ col[v.first][color] - cur.second){
                            dp[des] = dp[v.first] + col[v.first][color]- cur.second;
                            pq.push({dp[des],{des,0}});
                       }
                       long long val = dp[v.first];
                       if(!dpx[des].count(color) or dpx[des][color] > val){
                            dpx[des][color] = val;
                            pq.push({dpx[des][color],{des,color}});
                       }  
                   }
                }
          }
     }
}
int main(){
      cin>>n>>m;
      for(int i = 1; i <= m; i++){
           long long u,v,c,p; cin>>u>>v>>c>>p;
           adj[u][c].push_back({{v,c},p});
           adj[v][c].push_back({{u,c},p});
           col[u][c]+=p; 
           col[v][c]+=p;
      }
      dijsktra(1);
      if(dp[n] != bignum) cout<<dp[n]<<endl;
      else cout<<-1<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...