제출 #1323505

#제출 시각아이디문제언어결과실행 시간메모리
1323505ljlkj여행하는 상인 (APIO17_merchant)C++20
0 / 100
55 ms2448 KiB
#include<bits/stdc++.h> using namespace std; int n , m , k; const int N = 107; const int K = 1003; typedef long long ll; ll buyData[N][K]; ll sellData[N][K]; ll cost[N][N]; bool reach[N][N]; bool mark[N]; pair<ll , ll> ans[N][N]; ll d[N][N]; vector<pair<int ,ll>> adj[N]; void getInput(){ memset(buyData , -1 , sizeof buyData); memset(sellData , -1 , sizeof sellData); cin >> n >> m >> k; for(int i = 0; i < n; i++){ for(int j = 0; j < 2 * k; j++){ int co; cin >> co; if(j % 2 == 0) buyData[i][j / 2] = co; else sellData[i][j / 2] = co; } } for(int i = 0; i < m; i++){ int u , v; ll w; cin >> u >> v >> w; u-- , v--; adj[u].push_back({v , w}); adj[v].push_back({u , w}); } } void dfs(int u , int src){ mark[u] = true; reach[src][u] = true; for(auto v: adj[u]){ if(mark[v.first]) continue; dfs(v.first , src); } } void calcRech(){ for(int i = 0; i < n; i++){ memset(mark , 0 , sizeof mark); dfs(i , i); } } void calcCost(){ for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(!reach[i][j]){ cost[i][j] = 1e18; cost[j][i] = 1e18; continue; } for(int f = 0; f < k; f++){ cost[i][j] = max(cost[i][j] , sellData[j][f] - buyData[i][f]); } } } } void floydDis(){ for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) d[i][j] = 1e17; for(auto v: adj[i]){ d[i][v.first] = min(d[i][v.first] , v.second); } } for(int i = 0; i < n; i++){ for(int u = 0; u < n; u++){ for(int v = 0; v < n; v++){ if(!reach[u][v]) continue; d[u][v] = min(d[u][v] , d[u][i] + d[i][v]); } } } } pair<ll ,ll> maxPair(pair<ll , ll> x , pair<ll ,ll> y){ if(x.first * y.second < x.second * y.first) return y; return x; } void floydAns(){ for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++) { ans[i][j] = {1e18 , 1}; if(reach[i][j]) ans[i][j] = {cost[i][j] , d[i][j]}; } } for(int i = 0; i < n; i++){ for(int u = 0; u < n; u++){ for(int v = 0; v < n; v++){ if(u == v) continue; if(!reach[u][v]) continue; if(!reach[u][i] || !reach[i][v]) continue; ans[u][v] = maxPair({ans[u][i].first + ans[i][v].first , ans[u][i].second + ans[i][v].second} , ans[u][v]); } } } } ll getAns(){ pair<ll , ll> ansPair = {0 , 1}; for(int u = 0; u < n; u++){ for(int v = 0; v < n; v++){ if(u == v) continue; if(!reach[u][v] || !reach[v][u]) continue; ansPair = max(ansPair , {ans[u][v].first + ans[v][u].first , ans[u][v].second + ans[v][u].second}); } } return ansPair.first / ansPair.second; } int main(){ getInput(); calcRech(); calcCost(); floydDis(); floydAns(); cout << getAns() << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...