Submission #1280124

#TimeUsernameProblemLanguageResultExecution timeMemory
1280124edoIzlet (COI19_izlet)C++20
0 / 100
293 ms58068 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

class DSU{
    int n;
    vector<int> parent, sz;
    
public:
    DSU(int _n):n(_n), parent(_n), sz(_n, 1){
        iota(parent.begin(), parent.end(), 0);
    }

    void reset(){
        iota(parent.begin(), parent.end(), 0);
        fill(sz.begin(), sz.end(), 1);
    }

    int find(int x){
        if(x!=parent[x]){
            parent[x]=find(parent[x]);
        }       
        return parent[x];
    }

    bool unite(int x, int y){
        x=find(x);
        y=find(y);
        if(x==y)return false;
        if(sz[x]<sz[y])swap(x, y);
        parent[y]=x;
        sz[x]+=sz[y];
        return true;
    }

    bool same(int x, int y){
        return find(x)==find(y);
    }

    int size(int x){
        return sz[find(x)];
    }
};

void solve() {
    int _;
    cin >> _;
    int n;
    cin >> n;

    vector<vector<int>> g(n, vector<int>(n, 0));

    DSU dsu(n);
    for(int i=0; i<n; i++) 
        for(int j=0; j<n; j++){
            cin >> g[i][j];
            if(g[i][j]==1) dsu.unite(i, j);
        }
           
    vector<int> id(n, -1);
    vector<vector<int>> comp;
    for(int i=0; i<n; i++) {
        int r = dsu.find(i);
        if(id[r]==-1) {
            id[r] = (int)comp.size();
            comp.push_back({});
        }
        comp[id[r]].push_back(i);
    }
    
    vector<int> root(n, -1);
    int idx = 0;
    for(int i=0; i<n; i++)
        if(dsu.find(i)==i) 
            if(root[i]==-1) 
                root[i] = idx++;

    vector<int> rep(n, -1);
    for(int i=0; i<n; i++) rep[i] = dsu.find(i);

    unordered_map<int, int> mp;
    mp.reserve(n<<1);
    comp.clear();

    for(int i=0; i<n; i++){
        int rroot = rep[i];
        if(mp.find(rroot)==mp.end()) {
            int idd = (int)comp.size();
            mp[rroot]=idd;
            comp.push_back({});
        } 
        comp[mp[rroot]].push_back(i);
    }

    int m = (int)comp.size();
    for(int i=0; i<m; i++) rep[i] = comp[i][0];

    if(m==1) {
        for(int i=0; i<n; i++) {
            if(i) cout << " ";
            cout << 1;
        }
        cout << "\n";
        for(int i=1; i<n; i++) {
            cout << i << " " << i+1 << "\n";
        }
        return;
    }
    const int INF = (int)1e9;
    vector d(m, vector<int>(m, INF));
    for(int i=0; i<m; i++) 
        for(int j=0; j<m; j++) 
            d[i][j] = g[rep[i]][rep[j]] - 1;
        
    int r = 0;
    vector<int> droot(m, INF);
    int mx = 0;
    for(int i=0; i<m; i++) {
        droot[i] = d[r][i];
        if(droot[i] < INF) mx = max(mx, droot[i]);
    }

    vector<vector<int>> buckets(mx+1);
    for(int i=0; i<m; i++) 
        if(droot[i] < INF) buckets[droot[i]].push_back(i);
    vector<vector<int>> nodes(mx+1);
    vector<char> added(m, 0);
    added[r] = 1;
    nodes[0].push_back(r);
    vector<pair<int, int>> edges;
    for(int dd=1; dd<mx+1; dd++) {
        for(int cur : buckets[dd]) {
            int p = -1;
            for(int cand : nodes[dd-1]) {
                if(d[cand][cur] == 1) {
                    p = cand;
                    break;
                }
            }
            if(p==-1) {
                for(int pd=dd-1; ~pd && p==-1; --pd) {
                    for(int cand : nodes[pd]) {
                        if(d[cand][cur] == 1) {
                            p = cand;
                            break;
                        }
                    }
                }
            }
            edges.emplace_back(p, cur);
            added[cur] = 1;
            nodes[dd].push_back(cur);
        }
    }

    vector<pair<int, int>> fedges;
    for(int i=0; i<m; i++) {
        int rn = rep[i];
        for(size_t k=1; k<ssize(comp[i]); ++k) {
            fedges.emplace_back(rn+1, comp[i][k]+1);
        }
    }

    for(auto &[u, v] : edges) {
        fedges.emplace_back(u+1, v+1);
    }

    vector<int> c(n);
    for(int i=0; i<m; i++) {
        for(auto &j : comp[i])
            c[j] = i+1;
    }
    for(int i=0; i<n; i++) {
        if(i) cout << " ";
        cout << c[i];
    }
    cout << "\n";
    for(auto &[u, v] : fedges) {
        cout << u << " " << v << "\n";
    }
}

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

    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...