Submission #557096

# Submission time Handle Problem Language Result Execution time Memory
557096 2022-05-04T17:56:36 Z OttoTheDino Cities (BOI16_cities) C++17
74 / 100
6000 ms 122640 KB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#include <bits/stdc++.h>
using namespace std;

#define rep(i,s,e)                  for (ll i = s; i <= e; ++i)
#define rrep(i,s,e)                 for (ll i = s; i >= e; --i)
#define pb                          push_back
#define pf                          push_front
#define fi                          first
#define se                          second
#define all(a)                      a.begin(), a.end()
#define len(a)                      (ll)a.size()
typedef long long ll;
typedef pair<ll, ll> ii;
typedef vector<ii> vii;
typedef vector<ll> vi;
typedef vector<double> vd;
typedef vector<string> vs;
typedef vector<ll> vll;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    ll n, k, m; cin >> n >> k >> m;
    
    ll T = 3;

    ll dp[T+1][n][1<<k] = {};

    vii adj[n];

    rep (i,0,n-1) rep (j,1,(1<<k)-1) dp[0][i][j] = 1e15;

    rep (i,0,k-1) {
        ll x; cin >> x;
        --x;
        dp[0][x][1<<i] = 0;
    }

    rep (i,0,m-1) {
        ll u, v, c; cin >> u >> v >> c;
        u--, v--;
        adj[u].pb({v, c});
        adj[v].pb({u, c});
    }

    rep (a,0,T-1) {

        rep (i,0,(1<<k)-1) {

            set<ii> st;

            bool done[n] = {};

            rep (j,0,n-1) st.insert({dp[a][j][i], j});

            while (!st.empty()) {
                auto el = *st.begin();
                st.erase(st.begin());
                ll u = el.se, D = el.fi;

                if (done[u]) continue;
                done[u] = 1;

                for (auto vc : adj[u]) {
                    if (D + vc.se < dp[a][vc.fi][i]) {
                        dp[a][vc.fi][i] = D + vc.se;
                        st.insert({dp[a][vc.fi][i], vc.fi});
                    }
                }
            }

        }

        //join together different trees
        rep (i,0,n-1) {
            rep (j,0,(1<<k)-1) dp[a+1][i][j] = dp[a][i][j];

            for (auto vc : adj[i])
                rrep (j,(1<<k)-1,0)
                    rep (b,0,(1<<k)-1)
                        if ((j&b)==b)
                            dp[a+1][i][j] = min(dp[a+1][i][j], dp[a+1][i][j^b]+vc.se+dp[a][vc.fi][b]);
        }
    }

    ll ans = LLONG_MAX;
    rep (i,0,n-1) ans = min(ans, dp[T][i][(1<<k)-1]);
    cout << ans << "\n";

    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2480 ms 47724 KB Output is correct
2 Correct 2258 ms 48444 KB Output is correct
3 Correct 1364 ms 39252 KB Output is correct
4 Correct 164 ms 9424 KB Output is correct
5 Correct 987 ms 34964 KB Output is correct
6 Correct 88 ms 9260 KB Output is correct
7 Correct 7 ms 724 KB Output is correct
8 Correct 4 ms 596 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 1040 KB Output is correct
2 Correct 17 ms 1060 KB Output is correct
3 Correct 13 ms 952 KB Output is correct
4 Correct 12 ms 724 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4926 ms 72684 KB Output is correct
2 Correct 4860 ms 73576 KB Output is correct
3 Correct 3047 ms 64296 KB Output is correct
4 Correct 2775 ms 42768 KB Output is correct
5 Correct 730 ms 16560 KB Output is correct
6 Correct 425 ms 11724 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 6053 ms 122640 KB Time limit exceeded
2 Halted 0 ms 0 KB -