제출 #1258955

#제출 시각아이디문제언어결과실행 시간메모리
1258955notisoraRobot (JOI21_ho_t4)C++20
100 / 100
468 ms57172 KiB
///NotIsora
///This is my last dance
#include<bits/stdc++.h>
#define modulo 1000000007
#define fi first
#define se second
#define sq(x) (x)*(x)
#define ll long long
#define ld long double
#define el '\n'
#define pb push_back
///#define int long long

using namespace std;

const int N=1e5+5;
const ll INF=1e15;

struct Edge{
    int nx,c,p;
    bool operator < (const Edge&other) const{
        return c<other.c;
    }
};
vector<Edge>adj[N];
map<int,ll>sum[N];
int n,m;
map<int,ll>d[N];

struct State{
    int s,c;
    ll dis;
    bool operator < (const State&other) const{
        return dis>other.dis;
    }
};

void dijkstra(){
    priority_queue<State>pq;
    pq.push({1,0,0});
    d[1][0]=0;

    while(!pq.empty()){
        ll dis=pq.top().dis;
        int s=pq.top().s;
        int color=pq.top().c;
        pq.pop();

        if (d[s][color]<dis) continue;

        if (color==0){
            for(int i=0;i<(int)adj[s].size();i++){
                int u=adj[s][i].nx;
                int w=adj[s][i].p;
                int c=adj[s][i].c;

                if (!d[u].count(c)) d[u][c]=INF;
                if (!d[u].count(0)) d[u][0]=INF;

                if (d[u][c]>dis){
                    d[u][c]=dis;
                    pq.push({u,c,dis});
                }
                ///Reset mau = doi het mau canh khac hoac doi mau canh hien tai
                if (d[u][0]>dis+min(sum[s][c]-(ll)w,(ll)w)){
                    d[u][0]=dis+min(sum[s][c]-(ll)w,(ll)w);
                    pq.push({u,0,d[u][0]});
                }
            }
        }

        else{
            auto it=lower_bound(adj[s].begin(),adj[s].end(),Edge({0,color,0}));
            for(;it!=adj[s].end();it++){
                int u=it->nx;
                int w=it->p;
                int c=it->c;

                if (c!=color) break;
                if (!d[u].count(0)) d[u][0]=INF;

                if (d[u][0]>dis+sum[s][c]-(ll)w){
                    d[u][0]=dis+sum[s][c]-(ll)w;
                    pq.push({u,0,d[u][0]});
                }
            }
        }

    }
}

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //freopen("i.INP","r",stdin);
    cin>>n>>m;

    for(int i=1;i<=m;i++){
        int a,b,c,p;
        cin>>a>>b>>c>>p;
        adj[a].pb({b,c,p});
        adj[b].pb({a,c,p});
        sum[a][c]+=(ll)p;
        sum[b][c]+=(ll)p;
    }

    for(int i=1;i<=n;i++){
        sort(adj[i].begin(),adj[i].end());
    }

    dijkstra();

    if (!d[n].count(0) || d[n][0]==INF) cout<<-1;
    else cout<<d[n][0];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...