제출 #1022761

#제출 시각아이디문제언어결과실행 시간메모리
1022761DucNguyen2007Robot (JOI21_ho_t4)C++14
100 / 100
309 ms56680 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pll pair<ll,ll>
#define fi first
#define se second
const int maxN=2e5+5;
const ll inf=2e18;
int n,m;
ll d[maxN+1];
struct duongdi
{
    int u;
    ll w;
    bool operator < (const duongdi &o)const
    {
        return w>o.w;
    }
};
priority_queue<duongdi> pq;
struct col
{
    int u,c;
    ll p;
};
vector<col> adj[maxN+1];
ll color[maxN+1];
unordered_map<int,ll> mp[maxN+1];
int main()
{
    //freopen("","r",stdin);
    //freopen("","w",stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v,c;
        ll p;
        cin>>u>>v>>c>>p;
        adj[u].push_back({v,c,p});
        adj[v].push_back({u,c,p});
        mp[u][c]+=p;
        mp[v][c]+=p;
    }
    for(int i=1;i<=n;i++)
    {
        d[i]=inf;
    }
    d[1]=0;
    pq.push({1,0});
    while(!pq.empty())
    {
        duongdi tmp=pq.top();
        pq.pop();
        int u=tmp.u;
        ll w=tmp.w;
        if(d[u]<w)
        {
            continue;
        }
        for(auto i:adj[u])
        {
            color[i.c]=inf;
        }
        for(auto i:adj[u])
        {
            int v=i.u;
            ll tmp=mp[u][i.c]-i.p;
            color[i.c]=min(color[i.c],d[v]);
            if(d[v]>d[u]+tmp)
            {
                d[v]=d[u]+tmp;
                pq.push({v,d[v]});
            }
            if(d[v]>d[u]+i.p)
            {
                d[v]=d[u]+i.p;
                pq.push({v,d[v]});
            }
        }
        for(auto i:adj[u])
        {
            int v=i.u;
            ll tmp=mp[u][i.c]-i.p;
            if(d[v]>color[i.c]+tmp)
            {
                d[v]=color[i.c]+tmp;
                //cout<<v<<" "<<u<<" "<<mn<<" "<<tmp<<" "<<d[v]<<'\n';
                pq.push({v,d[v]});
            }
        }
    }
    if(d[n]==inf)
    {
        cout<<-1;
    }
    else cout<<d[n];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...