171762025-05-28 11:29:34AblablablaVasútépítéscpp17Hibás válasz 40/100100ms7808 KiB
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;

vector<vector<int>> csucsok, ans, egyutt, kor;
vector<bool> bejart;

int keres(int akt, int elozo){
    bejart[akt] = 1;
    egyutt.back().push_back(akt);
    int vissza = -1;

    for(int x : csucsok[akt]){
        if(x == elozo) continue;
        if(bejart[x]){
            vissza = x;
            continue;
        }

        int a = keres(x, akt);

        if(a != -1){
            vissza = a;
        }
    }

    if(vissza != -1){
        kor.back().push_back(akt);
    }

    if(vissza == akt){
        vissza = -1;
    }

    return vissza;
}

int szam = 0;

void berak(int i, int j){
    assert(ans[i][j] == -1 && ans[j][i] == -1);
    assert(i != j);

    ans[i][j] = szam;
    ans[j][i] = szam;
    szam++;
}

void megold(int akt){
    bejart[akt] = 1;

    for(int x : csucsok[akt]){
        if(bejart[x]) continue;

        berak(akt, x);
        megold(x);
    }
}

int main()
{
    int n, m;
    cin >> n >> m;


    csucsok.assign(n, vector<int>());
    ans.assign(n, vector<int>(n, -1));

    for(int i = 0; i < m; i++){
        int a, b;
        cin >> a >> b;
        a--; b--;

        csucsok[a].push_back(b);
        csucsok[b].push_back(a);
    }

    if(n < m){
        cout << "-1\n";
        return 0;
    }
    for(auto x : csucsok){
        if(x.size() == 0){
            cout << "-1\n";
            return 0;
        }
    }

    bejart.assign(n, 0);

    for(int i = 0; i < n; i++){
        if(!bejart[i]){
            egyutt.push_back(vector<int>());
            kor.push_back(vector<int>());

            keres(i, -1);
        }
    }

    int k = egyutt.size();

    for(auto x : egyutt){
        int akt = 0;
        for(int y : x){
            akt += csucsok[y].size();
        }

        akt /= 2;

        if(akt != x.size() - 1 && akt != x.size()){
            cout << "-1\n";
            return 0;
        }
    }

    /*cout << "egyutt:\n";
    for(auto x : egyutt){
        for(int y : x){
            cout << y  << " ";
        }
        cout << "\n";
    }
    cout << "\n";*/

    bejart.assign(n, 0);

    for(int i = 0; i < k; i++){
        if(kor[i].size() == 0){
            // fa

            megold(egyutt[i][0]);
        } else{
            // fak vezetnek a korbe

            // korben eloszor

            for(int j = 0; j < kor[i].size(); j++){
                int elozo = (j - 1 + kor[i].size()) % kor[i].size();

                berak(kor[i][j], kor[i][elozo]);
                bejart[kor[i][j]] = 1;
            }

            // aztan fakban

            for(int x : kor[i]){
                megold(x);
            }
        }
    }

    for(int i = 0; i + 1 < n; i++){
        for(int j = i + 1; j < n; j++){
            if(ans[i][j] == -1){
                ans[i][j] = szam;
                szam++;
            }
        }
    }

    assert(szam <= 1e9);

    for(int i = 0; i + 1 < n; i++){
        for(int j = i + 1; j < n; j++){
            cout << ans[i][j] << " ";
        }
        cout << "\n";
    }

    /*for(auto x : ans){
        for(int y : x){
            cout << y << "\t";
        }

        cout << "\n";
    }*/
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms316 KiB
2Elfogadva1ms316 KiB
3Elfogadva2ms316 KiB
subtask240/40
4Elfogadva68ms7776 KiB
5Elfogadva67ms7732 KiB
6Elfogadva65ms7640 KiB
7Elfogadva65ms7616 KiB
8Elfogadva71ms7732 KiB
9Elfogadva67ms7732 KiB
10Elfogadva65ms7732 KiB
11Elfogadva1ms504 KiB
subtask30/60
12Elfogadva68ms7776 KiB
13Elfogadva67ms7732 KiB
14Elfogadva65ms7640 KiB
15Elfogadva65ms7616 KiB
16Elfogadva71ms7732 KiB
17Elfogadva67ms7732 KiB
18Elfogadva65ms7732 KiB
19Elfogadva1ms504 KiB
20Hibás válasz68ms7732 KiB
21Hibás válasz67ms7732 KiB
22Hibás válasz65ms7732 KiB
23Hibás válasz65ms7808 KiB
24Hibás válasz68ms7732 KiB
25Hibás válasz68ms7804 KiB
26Hibás válasz68ms7728 KiB
27Elfogadva65ms7664 KiB
28Elfogadva100ms6468 KiB
29Elfogadva6ms4404 KiB
30Elfogadva6ms4404 KiB
31Elfogadva4ms4592 KiB