제출 #1259266

#제출 시각아이디문제언어결과실행 시간메모리
1259266wedonttalkanymoreOlympic Bus (JOI20_ho_t4)C++20
0 / 100
1095 ms7748 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#define int long long
#define pii pair<ll, ll>
#define fi first
#define se second

const ll N = 200 + 5, inf = 1e18, mod = 1e9 + 7, block = 320, lim = 16;

int n, m;
struct item {
    int v, c, d, id;
};
struct node {
    int u, v, c, d;
} a[100005];
vector <item> adj[N], radj[N];
bool check[100005], check1[100005];
int road1[100005], road2[100005];

int lenArr[N];

void dijk_forbid(int src, int cant, vector<item> graph[], int out[]) {
    for (int i = 1; i <= n; i++) out[i] = inf;
    out[src] = 0;
    priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> q;
    q.push({0, src});
    while (!q.empty()) {
        auto t = q.top(); q.pop();
        int val = t.fi, u = t.se;
        if (val > out[u]) continue;
        for (auto it : graph[u]) {
            int v = it.v, c = it.c, id = it.id;
            if (id == cant) continue;
            if (out[v] > out[u] + c) {
                out[v] = out[u] + c;
                q.push({out[v], v});
            }
        }
    }
}

void dijk_no_forbid(int src, vector<item> graph[], int out[]) {
    dijk_forbid(src, -1, graph, out);
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    if (fopen(".inp", "r")) {
        freopen(".inp", "r", stdin);
        freopen(".out", "w", stdout);
    }
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int u, v, c, d;
        cin >> u >> v >> c >> d;
        a[i] = {u, v, c, d};
        adj[u].push_back({v, c, d, i});
        radj[v].push_back({u, c, d, i});
    }
    static int from1[N], toN[N], fromN[N], to1[N];
    dijk_no_forbid(1, adj, from1);
    dijk_no_forbid(n, radj, toN);
    dijk_no_forbid(n, adj, fromN);
    dijk_no_forbid(1, radj, to1);
    int ans = inf;
    if (from1[n] < inf && fromN[1] < inf) ans = min(ans, from1[n] + fromN[1]);
    int minn = from1[n], minn2 = fromN[1];
    for (int i = 1; i <= m; i++) {
        int u = a[i].u, v = a[i].v, c = a[i].c;
        if (from1[u] < inf && toN[v] < inf && from1[u] + c + toN[v] == minn) check[i] = true;
    }
    for (int i = 1; i <= m; i++) {
        if (check[i]) {
            dijk_forbid(1, i, adj, lenArr);
            road1[i] = lenArr[n];
        } else road1[i] = minn;
    }
    for (int i = 1; i <= m; i++) {
        int u = a[i].u, v = a[i].v, c = a[i].c;
        if (fromN[u] < inf && to1[v] < inf && fromN[u] + c + to1[v] == minn2) check1[i] = true;
    }
    for (int i = 1; i <= m; i++) {
        if (check1[i]) {
            dijk_forbid(n, i, adj, lenArr);
            road2[i] = lenArr[1];
        } else road2[i] = minn2;
    }
    for (int i = 1; i <= m; i++) {
        if (road1[i] < inf && road2[i] < inf) ans = min(ans, road1[i] + road2[i]);
    }
    for (int i = 1; i <= m; i++) {
        int u = a[i].u, v = a[i].v, c = a[i].c, d = a[i].d;
        int val1 = inf, val2 = inf;
        if (from1[u] < inf && toN[v] < inf) val1 = from1[u] + c + toN[v];
        if (fromN[u] < inf && to1[v] < inf) val2 = fromN[u] + c + to1[v];
        if (val1 < inf && road2[i] < inf) ans = min(ans, val1 + road2[i] + d);
        if (val2 < inf && road1[i] < inf) ans = min(ans, road1[i] + val2 + d);
    }
    if (ans >= inf) cout << -1;
    else cout << ans;
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

ho_t4.cpp: In function 'int main()':
ho_t4.cpp:53:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   53 |         freopen(".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~
ho_t4.cpp:54:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   54 |         freopen(".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...