QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#356611 | #853. Flat Organization | Stinny | WA | 19ms | 5848kb | C++23 | 3.8kb | 2024-03-18 03:40:42 | 2024-03-18 03:40:42 |
Judging History
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 = 1e17 + 1337;
const int N = 1e5 + 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(rv) != rt.end())
rt.erase(rv);
}
}
// 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(ru) != rt.end())
rt.erase(ru);
}
}
// 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 (ru == rv)
ng[u].pb({0, v});
else if (d[u][v])
ng[u].pb({d[u][v], v});
}
}
int dp[n], pr[n];
fill(dp, dp + n, INF);
fill(pr, pr + n, -1);
set <pii> st = {{0, s}};
dp[s] = 0;
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 (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];
}
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]});
}
cout << "YES\n" << sz(ans) << " " << dp[e] << "\n";
for (auto& [u, v] : ans)
cout << u + 1 << " " << v + 1 << "\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: 5616kb
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: 5848kb
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