QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#421076#853. Flat OrganizationMobedTL 0ms3548kbC++143.3kb2024-05-25 11:24:292024-05-25 11:24:29

Judging History

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

  • [2024-05-25 11:24:29]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:3548kb
  • [2024-05-25 11:24:29]
  • 提交

answer

#include<bits/stdc++.h>

using namespace std;
const int inf = 1e9 + 1;
const int MOD = 1e9 + 7;

/*
const int N = 1e5 + 5;
int fac[N], inv[N];

int sum(int a, int b) { return (a + b + MOD + MOD) % MOD; }
int mul(int a, int b) { return 1ll * a * b % MOD; }
int Pow(int a, int b) {
    int res = 1;
    for (; b; b>>=1, a = mul(a, a)) if (b&1) {
        res = mul(res, a);
    }
    return res;
}
int C(int n, int k) {
    return mul(fac[n], mul(inv[k], inv[n - k]));
}
void prep() {
    fac[0] = 1;
    for (int i = 1; i < N; i++) fac[i] = mul(fac[i - 1], i);
    inv[N - 1] = Pow(fac[N - 1], MOD - 2);
    for (int i = N - 2; i >= 0; i--) inv[i] = mul(inv[i + 1], i + 1);
}
*/
const int N = 2e3 + 3;
int d[N][N];
bool mark[N];
int comp[N];
int dis[N], par[N];
int n; 
vector<int> vi;

void dfs(int v, int p = 0) {
    mark[v] = 1;
    for (int i = 1; i <= n; i++) if (i != p) {
        if (d[v][i] && !mark[i]) {
            dfs(i, v);
        }
    }
    vi.push_back(v);
}
void dfs_comp(int v, int c, int p = 0) {
    comp[v] = c;
    for (int i = 1; i <= n; i++) if (v != p) {
        if (d[i][v] && !comp[i]) {
            dfs_comp(i, c, v);
        }
    }
}
void Solve() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> d[i][j];
        }
    }
    if (n == 1) {
        cout << "YES\n";
        cout << "0 0\n";
        return;
    }
    if (n == 2) {
        cout << "NO\n";
        return;
    }
    fill(mark, mark + n + 1, 0);
    vi.clear();
    for (int i = 1; i <= n; i++) {
        if (!mark[i])
            dfs(i);
    }
    reverse(vi.begin(), vi.end());
    int c = 0;
    fill(comp, comp + n + 1, 0);
    for (int i = 0; i < vi.size(); i++) {
        if (!comp[vi[i]]) dfs_comp(vi[i], ++c);
    }
    fill(dis, dis + n + 1, inf);
    fill(par, par + n + 1, 0);
    for (int i = 1; i <= n; i++) {
        if (comp[i] == c) {
            dis[i] = 0;
            par[i] = 0;
        }
    }
    fill(mark, mark + n + 1, 0);
    for (int i = 1; i <= n; i++) {
        int v = 0;
        for (int u = 1; u <= n; u++) {
            if (mark[u]) continue;
            if (v) {
                if (dis[u] < dis[v]) v = u;
            } else v = u;
        }
        if (v == -1) break;
        mark[v] = 1;
        for (int i = 1; i <= n; i++) {
            if (d[i][v]) {
                if (dis[i] > dis[v] + d[i][v]) {
                    dis[i] = dis[v] + d[i][v];
                    par[i] = v;
                }
            }
        }
    }
    int ans = inf;
    int dest = 0;
    for (int i = 1; i <= n; i++) if (comp[i] == 1) {
        if (dis[i] < ans) {
            ans = dis[i];
            dest = i;
        }
    }
    cout << "YES\n";
    vector< pair<int, int> > vec;
    while (comp[dest] != c) {
        int p = par[dest];
        if (d[dest][p]) {
            vec.push_back({dest, p});
        }
        dest = p;
    }
    cout << vec.size() << " " << ans << "\n";
    for (auto [u, v] : vec) {
        cout << u << " " << v << "\n";
    }
}

int main() {
    // prep();
    // cout << C(5, 4) << endl;
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1; cin >> t;
    while (t--) {
        Solve();
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3548kb

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
Time Limit Exceeded

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:


result: