제출 #1131684

#제출 시각아이디문제언어결과실행 시간메모리
113168412345678Olympic Bus (JOI20_ho_t4)C++20
11 / 100
48 ms4164 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int nx=2e2+5, mx=5e4+5; ll n, m, u[mx], v[mx], dp[nx][nx], res=1e18, c[mx], d[mx], cst[nx], ced[nx], vs[nx], ord[nx], cnt, edg[nx][nx], f[mx]; vector<pair<ll, ll>> g[nx]; void dfs(int u, int x) { vs[u]=1; for (auto [v, idx]:g[u]) if (!vs[v]&&v!=x) dfs(v, x); } void dfsst(int u) { vs[u]=1; if (cst[u]) ord[u]=++cnt; for (auto [v, idx]:g[u]) if (!vs[v]) dfsst(v); } void dfsed(int u) { vs[u]=1; if (ced[u]) ord[u]=++cnt; for (auto [v, idx]:g[u]) if (!vs[v]) dfsed(v); } void dfsc(int u, int st, int ed) { vs[u]=1; for (auto [v, idx]:g[u]) if (!vs[v]&&!(u==st&&v==ed)) dfsc(v, st, ed); } int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n>>m; for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) if (i!=j) dp[i][j]=1e18; for (int i=1; i<=m; i++) cin>>u[i]>>v[i]>>c[i]>>d[i], dp[u[i]][v[i]]=min(dp[u[i]][v[i]], c[i]), g[u[i]].push_back({v[i], i}),edg[u[i]][v[i]]++; for (int k=1; k<=n; k++) for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) dp[i][j]=min(dp[i][j], dp[i][k]+dp[k][j]); res=min(res, dp[1][n]+dp[n][1]); cst[1]=ced[1]=cst[n]=ced[n]=1; for (int i=2; i<n; i++) { for (int j=1; j<=n; j++) vs[i]=0; dfs(1, i); cst[i]=!vs[n]; } cnt=0; for (int i=1; i<=n; i++) vs[i]=0, ord[i]=-1; dfsst(1); for (int i=1; i<=m; i++) { if (cst[u[i]]&&cst[v[i]]&&ord[u[i]]+1==ord[v[i]]&&edg[u[i]][v[i]]==1) { for (int j=1; j<=n; j++) vs[j]=0; dfsc(u[i], u[i], v[i]); if (!vs[v[i]]) f[i]=1; } } for (int i=2; i<n; i++) { for (int j=1; j<=n; j++) vs[j]=0; dfs(n, i); ced[i]=!vs[1]; } cnt=0; for (int i=1; i<=n; i++) vs[i]=0, ord[i]=-1; dfsed(n); for (int i=1; i<=m; i++) { if (ced[u[i]]&&ced[v[i]]&&ord[u[i]]+1==ord[v[i]]&&edg[u[i]][v[i]]==1) { for (int j=1; j<=n; j++) vs[j]=0; dfsc(u[i], u[i], v[i]); if (!vs[v[i]]) f[i]=1; } } for (int i=1; i<=m; i++) if (!f[i]) res=min(res, d[i]+min(dp[1][n], dp[1][v[i]]+dp[u[i]][n]+c[i])+min(dp[n][1], dp[n][v[i]]+dp[u[i]][1]+c[i])); if (res==1e18) cout<<-1; else cout<<res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...