제출 #1341998

#제출 시각아이디문제언어결과실행 시간메모리
1341998WarinchaiRobot (JOI21_ho_t4)C++20
100 / 100
591 ms82184 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;

vector<pair<int,pair<int,int>>>temp[400005];
vector<pair<int,int>>adj[400005];
vector<pair<int,pair<int,int>>>res[400005];
int val[400005];
int cnt[400005];
int dis[400005];
int sum[400005];
int com[400005];
int inf=1e18;
int cur=0;

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,m;cin>>n>>m;
    cur=n;
    for(int i=1;i<=m;i++){
        int a,b,c,p;cin>>a>>b>>c>>p;
        temp[a].push_back({b,{c,p}});
        temp[b].push_back({a,{c,p}});
    }
    for(int i=1;i<=n;i++){
        vector<int>v;
        for(auto x:temp[i]){
            int c=x.second.first;
            int p=x.second.second;
            cnt[c]++;
            res[c].push_back(x);
            sum[c]+=p;
            v.push_back(c);
        }
        sort(v.begin(),v.end());
        v.erase(unique(v.begin(),v.end()),v.end());
        com[i]=(v.size()==m);
        //cerr<<"com:"<<com[i]<<"\n";
        for(auto x:temp[i]){
            int c=x.second.first;
            int p=x.second.second;
            cnt[c]--;
            sum[c]-=p;
            res[c].clear();
        }
    }
    for(int i=1;i<=n;i++){
        vector<int>v;
        for(auto x:temp[i]){
            int c=x.second.first;
            int p=x.second.second;
            cnt[c]++;
            res[c].push_back(x);
            sum[c]+=p;
            v.push_back(c);
        }
        sort(v.begin(),v.end());
        v.erase(unique(v.begin(),v.end()),v.end());
        for(auto x:v){
            cur++;
            for(int i=0;i<res[x].size();i++){
                auto e=res[x][i];
                adj[e.first].push_back({cur,0});
                adj[cur].push_back({e.first,sum[x]-e.second.second});
            }
        }
        for(auto x:temp[i]){
            int go=x.first;
            int c=x.second.first;
            int p=x.second.second;
            adj[i].push_back({go,min(p,sum[c]-p)});
        }
        for(auto x:temp[i]){
            int c=x.second.first;
            int p=x.second.second;
            cnt[c]--;
            sum[c]-=p;
            res[c].clear();
        }
    }
    for(int i=1;i<=cur;i++)dis[i]=inf;
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
    pq.push({0,1});
    while(!pq.empty()){
        auto [cost,u]=pq.top();
        pq.pop();
        if(dis[u]!=inf)continue;
        dis[u]=cost;
        for(auto x:adj[u]){
            pq.push({cost+x.second,x.first});
        }
    }
    if(dis[n]==inf)cout<<"-1\n";
    else cout<<dis[n];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...