QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#356599#853. Flat OrganizationStinnyWA 19ms3840kbC++234.2kb2024-03-18 03:10:322024-03-18 03:10:32

Judging History

你现在查看的是最新测评结果

  • [2024-03-18 03:10:32]
  • 评测
  • 测评结果:WA
  • 用时:19ms
  • 内存:3840kb
  • [2024-03-18 03:10:32]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define f first
#define s second
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()

using pii = pair <int, int>;

const int INF = 1e16 + 1337;
const int N = 2e3 + 7;

vector <pii> g[N], ng[N];
int pr[N], in[N], c[N];
bool used[N];
int n;

int get(int u) {
    if (pr[u] == u)
        return u;

    return pr[u] = get(pr[u]);
}

void mrg(int r1, int r2) {
    if (r1 == r2)
        return;

    if (c[r1] < c[r2])
        swap(r1, r2);

    pr[r2] = r1;
    in[r1] += in[r2];
    c[r1] += c[r2];
}

void dfs(int u) {
    used[u] = true;
    pr[u] = u;
    in[u] = 1;
    c[u] = 1;

    for (auto& [w, v] : g[u]) {
        if (!used[v])
            dfs(v);

        int r = get(v);
        if (in[r])
            mrg(get(u), r);
    }

    int r = get(u);
    in[r]--;
}

void clr() {
    for (int u = 0; u < n; u++) {
        g[u].clear();
        ng[u].clear();
        used[u] = false;
    }
}

void solve() {
    cin >> n;
    int d[n][n];
    for (int u = 0; u < n; u++) {
        for (int v = 0; v < n; v++) {
            cin >> d[u][v];
            if (d[u][v] == 0)
                continue;

            g[u].pb({d[u][v], v});
        }
    }

    if (n == 2) {
        cout << "NO\n";
        return;
    }

    for (int u = 0; u < n; u++) {
        if (used[u])
            continue;

        dfs(u);
    }

    set <int> rt;
    for (int u = 0; u < n; u++)
        rt.insert(get(u));

    for (int u = 0; u < n; u++) {
        for (auto& [w, v] : g[u]) {
            int ru = get(u), rv = get(v);
            if (ru == rv)
                continue;

            if (rt.find(ru) != rt.end())
                rt.erase(ru);
        }
    }
    assert(sz(rt) == 1);
    int s = *rt.begin();

    rt.clear();
    for (int u = 0; u < n; u++)
        rt.insert(get(u));

    for (int u = 0; u < n; u++) {
        for (auto& [w, v] : g[u]) {
            int ru = get(u), rv = get(v);
            if (ru == rv)
                continue;

            if (rt.find(rv) != rt.end())
                rt.erase(rv);
        }
    }
    assert(sz(rt) == 1);
    int e = *rt.begin();

    for (int u = 0; u < n; u++) {
        for (int v = 0; v < n; v++) {
            int ru = get(u), rv = get(v);
//            if (u == 0 && v == 2) {
//                cout << ru << " " << rv << " " << d[u][v] << "|||||||\n";
//            }
            if (ru == rv)
                ng[v].pb({0, u});
            else if (d[u][v])
                ng[v].pb({d[u][v], u});
        }
    }

//    cout << s << " " << e << "|\n";
    int dp[n], pr[n];
    fill(dp, dp + n, INF);
    fill(pr, pr + n, -1);
    set <pii> st = {{0, s}};
    dp[s] = 0;
//    for (auto& [w, v] : ng[0])
//        cout << w << " " << v << "hete\n";
    while (!st.empty()) {
        int wn = st.begin()->f, u = st.begin()->s;
        st.erase(st.begin());

        if (dp[u] < wn)
            continue;

        for (auto& [w, v] : ng[u]) {
//            if (u == 0) {
//                cout << wn << " " << w << " " << v << "||\n";
//            }
            if (wn + w < dp[v]) {
                dp[v] = wn + w;
                pr[v] = u;
                st.insert({dp[v], v});
            }
        }
    }

    vector <int> path;
    int u = e;
    while (u != -1) {
        path.pb(u);
        u = pr[u];
    }
//    for (auto& x : path)
//        cout << x + 1 << " ";
//    cout << "\n\n";
//    reverse(all(path));

    vector <pii> ans;
    for (int i = 0; i < sz(path) - 1; i++) {
        assert(path[i] != path[i + 1]);
        if (get(path[i]) != get(path[i + 1]))
            ans.pb({path[i], path[i + 1]});
    }

//    assert(dp[e] != INF);
    cout << "YES\n" << sz(ans) << " " << dp[e] << "\n";
    for (auto& [u, v] : ans)
        cout << u + 1 << " " << v + 1 << "\n";
//    cout << "\n";
}

//1
//4
//0 5 0 2
//0 0 8 2
//2 0 0 1
//0 0 0 0

//1
//3
//0 10 3
//0 0 2
//0 0 0

//1
//3
//0 1 2
//0 0 0
//0 2 0

int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    cin >> t;
    while (t--)
        solve(), clr();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3560kb

input:

1
5
0 1 0 6 11
0 0 1 6 12
2 0 0 7 12
0 0 0 0 4
0 0 0 0 0

output:

YES
2 10
1 4
4 5

result:

ok OK!

Test #2:

score: -100
Wrong Answer
time: 19ms
memory: 3840kb

input:

100
5
0 1 0 6 11
0 0 1 6 12
2 0 0 7 12
0 0 0 0 4
0 0 0 0 0
1
0
2
0 0
7 0
2
0 1000000000
0 0
3
0 0 5
6 0 0
0 7 0
3
0 4 6
0 0 0
0 1 0
3
0 4 0
0 0 0
6 3 0
3
0 0 0
10 0 6
3 0 0
3
0 1999999998 1999999999
0 0 1999999998
0 0 0
50
0 105800 801 1800 64800 0 259200 288801 72201 12801 125000 20001 28801 33800 ...

output:

YES
2 10
1 4
4 5
YES
0 0
NO
NO
YES
0 0
YES
1 4
1 2
YES
1 3
3 2
YES
2 9
2 3
3 1
YES
1 1999999999
1 3
YES
3 602
4 33
11 47
34 39
YES
3 649
27 12
32 45
17 29
YES
5 1209
1 18
14 35
35 4
4 25
25 12
YES
3 844
3 8
1 41
14 21
YES
3 866
17 35
35 44
46 26
YES
4 1066
10 28
36 24
24 2
37 8
YES
3 1122
4 17
43 19...

result:

wrong answer Test 48: The solution is not optimal