Submission #1260170

#TimeUsernameProblemLanguageResultExecution timeMemory
1260170damoonTravelling Merchant (APIO17_merchant)C++20
0 / 100
605 ms2056 KiB
#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define bg __int128
#define ld long double
typedef pair<ll,ll> pii;
typedef pair<ll,pii> pip;
#define f first
#define s second
#define pb push_back

const ll L=110, L2=1010;
ll inf = 1;
int n,m,k;
ll S[L][L2],B[L][L2];
int bst[L][L];
vector<pip> edge,E;
ld dis[L][L];
ld D[L];

bool solve(ll x,int sr){
    if(x == 0)
        return 0;
    edge.clear();
    for(auto e:E){
        edge.pb(e);
        edge.back().f;
    }

    for(int u=1;u<=n;u++){
        for(int v=1;v<=n;v++){
            if(bst[u][v]){
                ll w = dis[u][v] - ((ld)S[v][bst[u][v]]-B[u][bst[u][v]])/x;
                //cout<<u<<" --  "<<w<<"  --> "<<v<<"   "<<endl;
                edge.pb(pip(w,pii(u,v)));
            }
        }
    }

    for(int i=1;i<=n;i++){
        D[i] = inf;
    }
    D[sr] = 0;
    for(int i=1;i<=n+1;i++){
        for(auto e:edge){
            D[e.s.s] = min(D[e.s.s], D[e.s.f] + e.f);
        }
    }

    /*
    cout<<"D: ";
    for(int i=1;i<=n;i++){
        cout<<D[i]<<" ";
    }
    cout<<endl;
    */
    bool ok = 1;
    for(auto e:edge){
        ok = ok and (D[e.s.s] <= D[e.s.f]+e.f);
    }
    return !ok;
}

int main(){

    inf = 1000ll*1000*1000*1000*1000*10+10;
    
    //ifstream cin ("in.in");
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
            cin>>B[i][j]>>S[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            dis[i][j] = inf;
        }
        dis[i][i] = 0;
    }
    for(int i=1;i<=m;i++){
        ll u,v,w;
        cin>>u>>v>>w;
        E.pb(pip(w,pii(u,v)));
        dis[u][v] = w;
    }

    for(int w=1;w<=n;w++){
        for(int u=1;u<=n;u++){
            for(int v=1;v<=n;v++){
                dis[u][v] = min(dis[u][v], dis[u][w] + dis[w][v]);
            }
        }
    }

    for(int u=1;u<=n;u++){
        for(int v=1;v<=n;v++){
            if(u == v)
                continue;
            pii mx = pii(-1e9+10,0);
            for(int i=1;i<=k;i++){
                if(S[v][i] != -1 and B[u][i] != -1){
                    mx = max(mx,pii(S[v][i]-B[u][i],i));
                }
            }
            bst[u][v] = mx.s;
        }
    }

    /*
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cout<<"dis["<<i<<"]["<<j<<"]: "<<dis[i][j]<<endl;
        }
    }
    cout<<endl;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cout<<"bst["<<i<<"]["<<j<<"]: "<<bst[i][j]<<endl;
        }
    }
    */

    ll l=0,r=1e9+10;
    while(r-l > 1){
        ll mid = (l+r)/2;
        if(solve(mid,1))
            l = mid;
        else
            r = mid;
    }

    for(int i=1;i<=n;i++){
        solve(r,i);
        for(int j=1;j<=n;j++){
            dis[i][j] = D[j];
        }
    }

    bool ok = 0;
    for(auto e:edge){
        ok = ok or (dis[e.s.s][e.s.f] == -e.f);
    }

    cout<<l+ok<<endl;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...