Submission #1258946

#TimeUsernameProblemLanguageResultExecution timeMemory
1258946notisoraRobot (JOI21_ho_t4)C++20
0 / 100
3096 ms47616 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;

        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 (color==0){
                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{
                if (c!=color) continue;
                if (d[u][0]>dis+sum[s][c]-(ll)w){
                    d[u][0]=dis+sum[s][c]-(ll)w;
                    pq.push({u,c,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...