Submission #1158923

#TimeUsernameProblemLanguageResultExecution timeMemory
1158923Marco_EscandonRobot (JOI21_ho_t4)C++20
34 / 100
3102 ms645648 KiB
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
typedef long long ll;
#define x first
#define y second
vector<vector<pair<int,int>>> cad;
map<int,vector<pair<int,int>>> cad2[(ll)1e5+5];
vector<map<int,ll>> c2;
vector<pair<int,int>> E;
int n,m;
struct st{
    ll cost;int node,ed;
    friend bool operator < (st a, st b)
    {
        return a.cost>b.cost;
    }
};
ll cmc()
{
    vector<map<int,ll>> v(cad.size()),v2(cad.size());
    priority_queue<st>q;q.push({1,1,m+1});
    while(!q.empty())
    {
        st temp=q.top();q.pop();
        //cerr<<temp.node<<" "<<temp.cost-1<<"\n";
        if(temp.ed==m+1)
        {
            if(v[temp.node][temp.ed]==0)
            {
                if(temp.node==n) return temp.cost-1;
                v[temp.node][temp.ed]=temp.cost;
                for(auto i:cad[temp.node])
                {
                    ll cnt=c2[temp.node][E[i.y].x]-E[i.y].y;
                    if(E[temp.ed].x==E[i.y].x)
                        cnt-=E[temp.ed].y;
                        ll t1=v2[i.x][m+1];
                    if(t1==0||temp.cost+min(cnt,(ll)E[i.y].y)<t1)
                    { 
                        q.push({temp.cost+min(cnt,(ll)E[i.y].y),i.x,m+1});  
                    }
                    t1=v2[i.x][i.y];
                    if(t1==0||temp.cost+E[i.y].y<t1)
                    {
                        q.push({temp.cost+E[i.y].y,i.x,i.y});
                    }
                }
            }
        }
        else if(v[temp.node][temp.ed]==0)
        {
            if(temp.node==n) return temp.cost-1;
            v[temp.node][temp.ed]=temp.cost;
            for(auto i:cad2[temp.node][E[temp.ed].x])
            {
                ll cnt=c2[temp.node][E[i.y].x]-E[i.y].y;
                if(E[temp.ed].x==E[i.y].x)
                    cnt-=E[temp.ed].y;
                ll t1=v2[i.x][m+1];
                if(t1==0||temp.cost+min(cnt,(ll)E[i.y].y)<t1)
                { 
                    q.push({temp.cost+min(cnt,(ll)E[i.y].y),i.x,m+1});  
                }
                t1=v2[i.x][i.y];
                if(t1==0||temp.cost+E[i.y].y<t1)
                {
                    q.push({temp.cost+E[i.y].y,i.x,i.y});
                }
            }
        }
    }
    return 1e16;
}
int main()
{
  
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    cad.resize(n+1);
    c2.resize(n+1);
    E.resize(m+2);
    for(int i=0; i<m; i++)
    {
        int a,b;
        cin>>a>>b>>E[i].x>>E[i].y;
        cad[a].push_back({b,i});
        cad[b].push_back({a,i});
        c2[a][E[i].x]+=E[i].y;
        c2[b][E[i].x]+=E[i].y;
        cad2[a][E[i].x].push_back({b,i});
        cad2[b][E[i].x].push_back({a,i});
    }
    ll t1=cmc();
    if(t1==1e16) t1=-1;
    cout<<t1; 
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...