제출 #1358566

#제출 시각아이디문제언어결과실행 시간메모리
1358566vjudge1Matryoshka (JOI16_matryoshka)C++20
0 / 100
0 ms436 KiB
#include <bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define int long long
#define all(v) v.begin(), v.end()
using namespace std;

const int mxn = 1e6 + 5, mod = 1e9 + 7, inf = 1e18;

void solve() {
    int n, m;
    cin >> n >> m;
    vector<pair<int, int>> adj[n + 1];
    for (int i = 1; i <= m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        adj[u].pb({v, w});
        adj[v].pb({u, w});
    }
    int res[n + 1][n + 1];
    for (int i = 1; i <= n; i++) {
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
        pq.push({0, i});
        vector<int> vis(n + 1, 0), dis(n + 1, inf);
        dis[i] = 0;
        while (pq.size()) {
            int u = pq.top().ss;
            pq.pop();
            if (vis[u]) continue;
            vis[u] = 1;
            for (auto[v, len]: adj[u]) {
                if (dis[u] + len < dis[v]) {
                    dis[v] = dis[u] + len;
                    pq.push({dis[v], v});
                }
            }
        }
        for (int j = 1; j <= n; j++) {
            res[i][j] = dis[j];
        }
    } 

    /*
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cout << res[i][j] << ' ';
        }
        cout << '\n';
    }
    */
    int ans = inf;
    string str;
    for (int mask = 0; mask < (1 << n); mask++) {
        vector<int> col(n + 1, 0);
        bool ok1 = false, ok0 = false;
        for (int i = 1; i <= n; i++) {
            if (mask & (1 << (i - 1))) {
                col[i] = 1;
                ok1 = true;
            }
            else {
                col[i] = 0;
                ok0 = true;
            }
        }
        if (!ok1 || !ok0) {
            continue;
        }
        int mx = 0;
        for (int i = 1; i <= n; i++) {
            int m0 = inf, m1 = inf;
            for (int j = 1; j <= n; j++) {
                if (i == j) continue;
                if (col[j] == 1) {
                    m1 = min(m1, res[i][j]);
                }
                else {
                    m0 = min(m0, res[i][j]);
                }
            }
            mx = max(mx, min(m1, m0));
        }
        if (mx < ans) {
            ans = mx;
            string cur;
            for (int i = 1; i <= n; i++) {
                if (col[i] == 1) cur += 'D';
                else cur += 'B';
            }
            str = cur;
        }
    }
    cout << ans << '\n';
    cout << str;
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    int t = 1;
    // cin >> t;
    for (int i = 1; i <= t; i++) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...