QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#58414#3846. Link-Cut TreettTL 15ms20208kbC++2.2kb2022-10-26 12:13:552022-10-26 12:13:58

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-10-26 12:13:58]
  • 评测
  • 测评结果:TL
  • 用时:15ms
  • 内存:20208kb
  • [2022-10-26 12:13:55]
  • 提交

answer

#define fr(i, a, b) for(ll i = a; i <= b; ++i)
#define frd(i, a, b) for(ll i = a; i >= b; --i)

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<ll, ll> PLL;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll T;

/* ============================================================================= */

const ll N = 1e6;
ll n, m;
ll h[N], e[N], ne[N], w[N], idx;
ll aa[N], bb[N];

void add(ll a, ll b, ll c) {
    e[idx] = b;
    w[idx] = c;
    ne[idx] = h[a];
    h[a] = idx++;
}

ll p[N];

ll find(ll x) {
    if (p[x] == x) return x;
    return p[x] = find(p[x]);
}

vector<ll> record;
bool st[N];

bool dfs(ll u, ll start) {

    st[u] = true; // st[u] 表示点u已经被遍历过

    for (ll i = h[u]; i != -1; i = ne[i]) {
        ll j = e[i];
        ll ww = w[i];

        if (!st[j]) {
            record.push_back(ww);
            if (!dfs(j, start)) record.pop_back();
            else return true;
        } else {
            if (j == start){
                record.push_back(ww);
                return true;
            }
        }
    }
    return false;
}

void init() {
    fr(i, 1, N - 1) p[i] = i;
    memset(h, -1, sizeof h);
    memset(st, 0, sizeof st);
    idx = 0;
    while (!record.empty()) record.pop_back();
}


int main() {

    cin >> T;
    while (T--) {
        init();
        cin >> n >> m;
        ll a, b;
        ll ww = 1;
        ll flag = true;
        fr(i, 1, m) {
            cin >> aa[i] >> bb[i];
        }
        fr(i, 1, m) {

            a = aa[i];
            b = bb[i];

            add(a, b, ww);
            if (find(a) == find(b)) break;
            add(b, a, ww);
            ww += 1;
            p[find(a)] = find(b);
            // no circle
            if (i == m) {
                cout << -1 << endl;
                flag = false;
            }
        }


        if (!flag) continue;
        dfs(a, a);

        sort(record.begin(), record.end());
        for (int i = 0; i < record.size()-1; ++i) {
            cout << record[i] << " ";
        }
        cout << record[record.size()-1] << endl;

    }


    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 15ms
memory: 20208kb

input:

2
6 8
1 2
2 3
5 6
3 4
2 5
5 4
5 1
4 2
4 2
1 2
4 3

output:

2 4 5 6
-1

result:

ok 2 lines

Test #2:

score: -100
Time Limit Exceeded

input:

1658
9 20
6 4
5 8
1 7
2 3
3 8
3 1
4 8
5 3
7 6
1 6
4 9
4 1
9 3
2 5
4 5
8 9
1 8
4 2
5 7
3 6
14 78
13 12
10 8
2 10
6 13
2 14
13 1
14 10
9 6
2 13
8 3
9 8
5 6
14 12
8 1
9 14
9 5
12 6
5 10
3 12
10 4
8 5
9 10
6 8
1 6
12 4
3 13
1 5
10 3
13 9
10 13
2 5
4 7
7 1
7 6
9 3
2 12
1 10
9 1
1 14
3 1
3 4
11 1
11 6
7 1...

output:

2 5 8
3 5 7
1 3 4
2 3 4
2 3 4 7 13
1 3 4 5 9
3 4 7 12
1 2 3
8 10 11
2 3 5 7 12 13 14 15 16
1 2 3 5
1 2 4
1 3 4
1 2 3
1 2 3
10 11 15
1 5 6
1 5 7
1 2 3 4
-1
1 3 6
-1
1 2 3 5
-1
-1
6 8 9 10 11 16
1 2 6
2 3 4
-1
-1
7 8 12 13 18
-1
1 4 8 12
3 5 10
4 6 8
1 2 3 4
3 5 6
5 8 10 15
4 6 8
-1
1 2 3 5 6
1 3 4
1 ...

result: